Selaa lähdekoodia

use framework reference counter

Kolja Strohm 3 vuotta sitten
vanhempi
commit
c925ea6548

+ 4 - 2
Linie Linux/Linie Linux.vcxproj

@@ -68,7 +68,7 @@
     <TargetName>Linie</TargetName>
     <TargetExt>.so</TargetExt>
     <RemoteProjectDir>$(RemoteRootDir)/Spiele/Linie/debug</RemoteProjectDir>
-    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\..\..\Allgemein\Network\Network;../../../Framework/debug;../../../Network/debug;..\Linie;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\..\..\Allgemein\Network\Network;../../../../Framework/debug;../../../../Network/debug/Network;..\Linie;$(IncludePath)</IncludePath>
     <OutDir>$(RemoteRootDir)/Spiele/Linie/debug/</OutDir>
     <IntDir>$(RemoteRootDir)/Spiele/Linie/debug/</IntDir>
     <RemoteTargetPath>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</RemoteTargetPath>
@@ -77,7 +77,7 @@
     <TargetName>Linie</TargetName>
     <TargetExt>.so</TargetExt>
     <RemoteProjectDir>$(RemoteRootDir)/Spiele/Linie/release</RemoteProjectDir>
-    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\..\..\Allgemein\Network\Network;../../../Framework/release;../../../Network/release;..\Linie;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\..\..\Allgemein\Network\Network;../../../../Framework/release;../../../../Network/release/Network;..\Linie;$(IncludePath)</IncludePath>
     <OutDir>$(RemoteRootDir)/Spiele/Linie/release/</OutDir>
     <IntDir>$(RemoteRootDir)/Spiele/Linie/release/</IntDir>
     <RemoteTargetPath>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</RemoteTargetPath>
@@ -120,6 +120,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Link>
       <UnresolvedSymbolReferences>false</UnresolvedSymbolReferences>
+      <OutputFile>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</OutputFile>
     </Link>
     <ClCompile>
       <AdditionalOptions>-fPIC %(AdditionalOptions)</AdditionalOptions>
@@ -128,6 +129,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Link>
       <UnresolvedSymbolReferences>false</UnresolvedSymbolReferences>
+      <OutputFile>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</OutputFile>
     </Link>
     <ClCompile>
       <AdditionalOptions>-fPIC %(AdditionalOptions)</AdditionalOptions>

BIN
Linie Linux/Linie.so


+ 106 - 121
Linie/Bestenliste.cpp

@@ -3,169 +3,154 @@
 // Inhalt der Bestenliste Klasse aus Bestenliste.h
 // Konstruktor
 Bestenliste::Bestenliste()
+    : ReferenceCounter()
 {
-	spielerPunkte = new Array< int >();
-	spielerNummern = new Array< int >();
-	teamPunkte = new Array< int >();
-	teamMaxPunkte = new Array< int >();
-	teamNummern = new Array< int >();
-	spielerAnzahl = 0;
-	teamAnzahl = 0;
-	ref = 1;
+    spielerPunkte = new Array< int >();
+    spielerNummern = new Array< int >();
+    teamPunkte = new Array< int >();
+    teamMaxPunkte = new Array< int >();
+    teamNummern = new Array< int >();
+    spielerAnzahl = 0;
+    teamAnzahl = 0;
 }
 
 // Destruktor
 Bestenliste::~Bestenliste()
 {
-	spielerPunkte->release();
-	spielerNummern->release();
-	teamPunkte->release();
-	teamMaxPunkte->release();
-	teamNummern->release();
+    spielerPunkte->release();
+    spielerNummern->release();
+    teamPunkte->release();
+    teamMaxPunkte->release();
+    teamNummern->release();
 }
 
 // nicht constant
 void Bestenliste::setTeamMaxPunkte( int team, int mP )
 {
-	int i = -1;
-	for( int j = 0; j < teamAnzahl; j++ )
-	{
-		if( teamNummern->hat( j ) && teamNummern->get( j ) == team )
-		{
-			i = j;
-			break;
-		}
-	}
-	if( i < 0 )
-	{
-		i = teamAnzahl;
-		teamNummern->add( team, teamAnzahl );
-		teamPunkte->add( 0, teamAnzahl );
-		teamMaxPunkte->add( 0, teamAnzahl );
-		teamAnzahl++;
-	}
-	teamMaxPunkte->set( mP, i );
+    int i = -1;
+    for( int j = 0; j < teamAnzahl; j++ )
+    {
+        if( teamNummern->hat( j ) && teamNummern->get( j ) == team )
+        {
+            i = j;
+            break;
+        }
+    }
+    if( i < 0 )
+    {
+        i = teamAnzahl;
+        teamNummern->add( team, teamAnzahl );
+        teamPunkte->add( 0, teamAnzahl );
+        teamMaxPunkte->add( 0, teamAnzahl );
+        teamAnzahl++;
+    }
+    teamMaxPunkte->set( mP, i );
 }
 
 void Bestenliste::setTeamPunkte( int team, int p )
 {
-	for( int i = 0; i < teamAnzahl; i++ )
-	{
-		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
-		{
-			teamPunkte->set( p, i );
-			return;
-		}
-	}
+    for( int i = 0; i < teamAnzahl; i++ )
+    {
+        if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
+        {
+            teamPunkte->set( p, i );
+            return;
+        }
+    }
 }
 
 void Bestenliste::setSpielerPunkte( int spieler, int p )
 {
-	int i = -1;
-	for( int j = 0; j < spielerAnzahl; j++ )
-	{
-		if( spielerNummern->hat( j ) && spielerNummern->get( j ) == spieler )
-		{
-			i = j;
-			break;
-		}
-	}
-	if( i < 0 )
-	{
-		i = spielerAnzahl;
-		spielerNummern->add( spieler, spielerAnzahl );
-		spielerPunkte->add( 0, spielerAnzahl );
-		spielerAnzahl++;
-	}
-	spielerPunkte->set( p, i );
+    int i = -1;
+    for( int j = 0; j < spielerAnzahl; j++ )
+    {
+        if( spielerNummern->hat( j ) && spielerNummern->get( j ) == spieler )
+        {
+            i = j;
+            break;
+        }
+    }
+    if( i < 0 )
+    {
+        i = spielerAnzahl;
+        spielerNummern->add( spieler, spielerAnzahl );
+        spielerPunkte->add( 0, spielerAnzahl );
+        spielerAnzahl++;
+    }
+    spielerPunkte->set( p, i );
 }
 
 void Bestenliste::addTeamPunkt( int team, bool plus )
 {
-	for( int i = 0; i < teamAnzahl; i++ )
-	{
-		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
-		{
-			int jetzt = teamPunkte->hat( i ) ? teamPunkte->get( i ) : 0;
-			if( plus )
-				jetzt++;
-			else
-				jetzt--;
-			if( jetzt < 0 )
-				jetzt = 0;
-			teamPunkte->set( jetzt, i );
-			return;
-		}
-	}
+    for( int i = 0; i < teamAnzahl; i++ )
+    {
+        if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
+        {
+            int jetzt = teamPunkte->hat( i ) ? teamPunkte->get( i ) : 0;
+            if( plus )
+                jetzt++;
+            else
+                jetzt--;
+            if( jetzt < 0 )
+                jetzt = 0;
+            teamPunkte->set( jetzt, i );
+            return;
+        }
+    }
 }
 
 void Bestenliste::addSpielerPunkt( int spieler, bool plus )
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( spielerNummern->hat( i ) && spielerNummern->get( i ) == spieler )
-		{
-			if( plus )
-				spielerPunkte->set( ( spielerPunkte->hat( i ) ? spielerPunkte->get( i ) : 0 ) + 1, i );
-			else
-				spielerPunkte->set( ( spielerPunkte->hat( i ) ? spielerPunkte->get( i ) : 0 ) - 1, i );
-			return;
-		}
-	}
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( spielerNummern->hat( i ) && spielerNummern->get( i ) == spieler )
+        {
+            if( plus )
+                spielerPunkte->set( ( spielerPunkte->hat( i ) ? spielerPunkte->get( i ) : 0 ) + 1, i );
+            else
+                spielerPunkte->set( ( spielerPunkte->hat( i ) ? spielerPunkte->get( i ) : 0 ) - 1, i );
+            return;
+        }
+    }
 }
 
 // constant
 bool Bestenliste::istTeamAmLeben( int team ) const
 {
-	for( int i = 0; i < teamAnzahl; i++ )
-	{
-		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
-			return teamPunkte->hat( i ) && teamPunkte->get( i ) != 0;
-	}
-	return 0;
+    for( int i = 0; i < teamAnzahl; i++ )
+    {
+        if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
+            return teamPunkte->hat( i ) && teamPunkte->get( i ) != 0;
+    }
+    return 0;
 }
 
 bool Bestenliste::hatTeamGewonnen( int team ) const
 {
-	for( int i = 0; i < teamAnzahl; i++ )
-	{
-		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
-			return ( ( teamPunkte->hat( i ) && teamMaxPunkte->hat( i ) ) ? ( teamPunkte->get( i ) >= teamMaxPunkte->get( i ) ) : 0 );
-	}
-	return 0;
+    for( int i = 0; i < teamAnzahl; i++ )
+    {
+        if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
+            return ( ( teamPunkte->hat( i ) && teamMaxPunkte->hat( i ) ) ? ( teamPunkte->get( i ) >= teamMaxPunkte->get( i ) ) : 0 );
+    }
+    return 0;
 }
 
 int Bestenliste::getTeamPunkte( int team ) const
 {
-	for( int i = 0; i < teamAnzahl; i++ )
-	{
-		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
-			return teamPunkte->hat( i ) ? teamPunkte->get( i ) : 0;
-	}
-	return 0;
+    for( int i = 0; i < teamAnzahl; i++ )
+    {
+        if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
+            return teamPunkte->hat( i ) ? teamPunkte->get( i ) : 0;
+    }
+    return 0;
 }
 
 int Bestenliste::getTeamMaxPunkte( int team ) const
 {
-	for( int i = 0; i < teamAnzahl; i++ )
-	{
-		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
-			return teamMaxPunkte->hat( i ) ? teamMaxPunkte->get( i ) : 0;
-	}
-	return 0;
-}
-
-// Reference Counting
-Bestenliste *Bestenliste::getThis()
-{
-	ref++;
-	return this;
-}
-
-Bestenliste *Bestenliste::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    for( int i = 0; i < teamAnzahl; i++ )
+    {
+        if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
+            return teamMaxPunkte->hat( i ) ? teamMaxPunkte->get( i ) : 0;
+    }
+    return 0;
 }

+ 24 - 28
Linie/Bestenliste.h

@@ -5,38 +5,34 @@
 
 using namespace Framework;
 
-class Bestenliste
+class Bestenliste : public virtual ReferenceCounter
 {
 private:
-	Array< int > *spielerPunkte;
-	Array< int > *spielerNummern;
-	Array< int > *teamPunkte;
-	Array< int > *teamMaxPunkte;
-	Array< int > *teamNummern;
-	int spielerAnzahl;
-	int teamAnzahl;
-	int ref;
+    Array< int > *spielerPunkte;
+    Array< int > *spielerNummern;
+    Array< int > *teamPunkte;
+    Array< int > *teamMaxPunkte;
+    Array< int > *teamNummern;
+    int spielerAnzahl;
+    int teamAnzahl;
 
 public:
-	// Konstruktor
-	Bestenliste();
-	// Destruktor
-	~Bestenliste();
-	// nicht constant
-	void setTeamMaxPunkte( int team, int mP );
-	void setTeamPunkte( int team, int p );
-	void setSpielerPunkte( int spieler, int p );
-	void addTeamPunkt( int team, bool plus );
-	void addSpielerPunkt( int spieler, bool plus );
-	void neueRunde();
-	// constant
-	bool istTeamAmLeben( int team ) const;
-	bool hatTeamGewonnen( int team ) const;
-	int getTeamPunkte( int team ) const;
-	int getTeamMaxPunkte( int team ) const;
-	// Reference Counting
-	Bestenliste *getThis();
-	Bestenliste *release();
+    // Konstruktor
+    Bestenliste();
+    // Destruktor
+    ~Bestenliste();
+    // nicht constant
+    void setTeamMaxPunkte( int team, int mP );
+    void setTeamPunkte( int team, int p );
+    void setSpielerPunkte( int spieler, int p );
+    void addTeamPunkt( int team, bool plus );
+    void addSpielerPunkt( int spieler, bool plus );
+    void neueRunde();
+    // constant
+    bool istTeamAmLeben( int team ) const;
+    bool hatTeamGewonnen( int team ) const;
+    int getTeamPunkte( int team ) const;
+    int getTeamMaxPunkte( int team ) const;
 };
 
 #endif

+ 55 - 70
Linie/GesamtSpielerStatistik.cpp

@@ -3,141 +3,126 @@
 // Inhalt der GesamtSpielerStatistik Klasse aus GesamtSpielerStatistik.h
 // Konstruktor
 GesamtSpielerStatistik::GesamtSpielerStatistik()
-{
-	spielerNummer = 0;
-	spielerName = new Text();
-	teamName = new Text();
-	spielerFarbe = 0;
-	teamFarbe = 0;
-	gewonneneRunden = 0;
-	punkte = 0;
-	linienLength = 0;
-	zeitAmLeben = 0;
-	zeitTod = 0;
-	kills = 0;
-	tode = 0;
-	ref = 1;
+    : ReferenceCounter()
+{
+    spielerNummer = 0;
+    spielerName = new Text();
+    teamName = new Text();
+    spielerFarbe = 0;
+    teamFarbe = 0;
+    gewonneneRunden = 0;
+    punkte = 0;
+    linienLength = 0;
+    zeitAmLeben = 0;
+    zeitTod = 0;
+    kills = 0;
+    tode = 0;
 }
 
 // Destruktor
 GesamtSpielerStatistik::~GesamtSpielerStatistik()
 {
-	spielerName->release();
-	teamName->release();
+    spielerName->release();
+    teamName->release();
 }
 
 // nicht constant
 void GesamtSpielerStatistik::initValues( InitDatei *dat )
 {
-	if( dat->wertExistiert( "SpielerNummer" ) )
-		spielerNummer = *dat->zWert( "SpielerNummer" );
-	if( dat->wertExistiert( "SpielerName" ) )
-		*spielerName = dat->zWert( "SpielerName" )->getText();
-	if( dat->wertExistiert( "TeamName" ) )
-		*teamName = dat->zWert( "TeamName" )->getText();
-	if( dat->wertExistiert( "SpielerFarbe" ) )
-		spielerFarbe = *dat->zWert( "SpielerFarbe" );
-	if( dat->wertExistiert( "TeamFarbe" ) )
-		teamFarbe = *dat->zWert( "TeamFarbe" );
-	if( dat->wertExistiert( "GewonneneRunden" ) )
-		gewonneneRunden = *dat->zWert( "GewonneneRunden" );
-	if( dat->wertExistiert( "Punkte" ) )
-		punkte = *dat->zWert( "Punkte" );
-	if( dat->wertExistiert( "LinienLänge" ) )
-		linienLength = *dat->zWert( "LinienLänge" );
-	if( dat->wertExistiert( "ZeitAmLeben" ) )
-		zeitAmLeben = *dat->zWert( "ZeitAmLeben" );
-	if( dat->wertExistiert( "ZeitTod" ) )
-		zeitTod = *dat->zWert( "ZeitTod" );
-	if( dat->wertExistiert( "Kills" ) )
-		kills = *dat->zWert( "Kills" );
-	if( dat->wertExistiert( "Tode" ) )
-		tode = *dat->zWert( "Tode" );
-	dat->release();
+    if( dat->wertExistiert( "SpielerNummer" ) )
+        spielerNummer = *dat->zWert( "SpielerNummer" );
+    if( dat->wertExistiert( "SpielerName" ) )
+        *spielerName = dat->zWert( "SpielerName" )->getText();
+    if( dat->wertExistiert( "TeamName" ) )
+        *teamName = dat->zWert( "TeamName" )->getText();
+    if( dat->wertExistiert( "SpielerFarbe" ) )
+        spielerFarbe = *dat->zWert( "SpielerFarbe" );
+    if( dat->wertExistiert( "TeamFarbe" ) )
+        teamFarbe = *dat->zWert( "TeamFarbe" );
+    if( dat->wertExistiert( "GewonneneRunden" ) )
+        gewonneneRunden = *dat->zWert( "GewonneneRunden" );
+    if( dat->wertExistiert( "Punkte" ) )
+        punkte = *dat->zWert( "Punkte" );
+    if( dat->wertExistiert( "LinienLänge" ) )
+        linienLength = *dat->zWert( "LinienLänge" );
+    if( dat->wertExistiert( "ZeitAmLeben" ) )
+        zeitAmLeben = *dat->zWert( "ZeitAmLeben" );
+    if( dat->wertExistiert( "ZeitTod" ) )
+        zeitTod = *dat->zWert( "ZeitTod" );
+    if( dat->wertExistiert( "Kills" ) )
+        kills = *dat->zWert( "Kills" );
+    if( dat->wertExistiert( "Tode" ) )
+        tode = *dat->zWert( "Tode" );
+    dat->release();
 }
 
 // constant
 int GesamtSpielerStatistik::getSpielerNummer() const
 {
-	return spielerNummer;
+    return spielerNummer;
 }
 
 Text *GesamtSpielerStatistik::getSpielerName() const
 {
-	return spielerName ? spielerName->getThis() : 0;
+    return spielerName ? dynamic_cast<Text *>( spielerName->getThis() ) : 0;
 }
 
 Text *GesamtSpielerStatistik::zSpielerName() const
 {
-	return spielerName;
+    return spielerName;
 }
 
 Text *GesamtSpielerStatistik::getTeamName() const
 {
-	return teamName ? teamName->getThis() : 0;
+    return teamName ? dynamic_cast<Text *>( teamName->getThis() ) : 0;
 }
 
 Text *GesamtSpielerStatistik::zTeamName() const
 {
-	return teamName;
+    return teamName;
 }
 
 int GesamtSpielerStatistik::getSpielerFarbe() const
 {
-	return spielerFarbe;
+    return spielerFarbe;
 }
 
 int GesamtSpielerStatistik::getTeamFarbe() const
 {
-	return teamFarbe;
+    return teamFarbe;
 }
 
 int GesamtSpielerStatistik::getGewonneneRunden() const
 {
-	return gewonneneRunden;
+    return gewonneneRunden;
 }
 
 int GesamtSpielerStatistik::getPunkte() const
 {
-	return punkte;
+    return punkte;
 }
 
 int GesamtSpielerStatistik::getLinienLength() const
 {
-	return linienLength;
+    return linienLength;
 }
 
 int GesamtSpielerStatistik::getZeitAmLeben() const
 {
-	return zeitAmLeben;
+    return zeitAmLeben;
 }
 
 int GesamtSpielerStatistik::getZeitTod() const
 {
-	return zeitTod;
+    return zeitTod;
 }
 
 int GesamtSpielerStatistik::getKills() const
 {
-	return kills;
+    return kills;
 }
 
 int GesamtSpielerStatistik::getTode() const
 {
-	return tode;
-}
-
-// Reference Counting
-GesamtSpielerStatistik *GesamtSpielerStatistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-GesamtSpielerStatistik *GesamtSpielerStatistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return tode;
 }

+ 34 - 38
Linie/GesamtSpielerStatistik.h

@@ -6,48 +6,44 @@
 
 using namespace Framework;
 
-class GesamtSpielerStatistik
+class GesamtSpielerStatistik : public virtual ReferenceCounter
 {
 private:
-	int spielerNummer;
-	Text *spielerName;
-	Text *teamName;
-	int spielerFarbe;
-	int teamFarbe;
-	int gewonneneRunden;
-	int punkte;
-	int linienLength;
-	int zeitAmLeben;
-	int zeitTod;
-	int kills;
-	int tode;
-	int ref;
+    int spielerNummer;
+    Text *spielerName;
+    Text *teamName;
+    int spielerFarbe;
+    int teamFarbe;
+    int gewonneneRunden;
+    int punkte;
+    int linienLength;
+    int zeitAmLeben;
+    int zeitTod;
+    int kills;
+    int tode;
 
 public:
-	// Konstruktor
-	GesamtSpielerStatistik();
-	// Destruktor
-	~GesamtSpielerStatistik();
-	// nicht constant
-	void initValues( InitDatei *dat );
-	// constant
-	int getSpielerNummer() const;
-	Text *getSpielerName() const;
-	Text *zSpielerName() const;
-	Text *getTeamName() const;
-	Text *zTeamName() const;
-	int getSpielerFarbe() const;
-	int getTeamFarbe() const;
-	int getGewonneneRunden() const;
-	int getPunkte() const;
-	int getLinienLength() const;
-	int getZeitAmLeben() const;
-	int getZeitTod() const;
-	int getKills() const;
-	int getTode() const;
-	// Reference Counting
-	GesamtSpielerStatistik *getThis();
-	GesamtSpielerStatistik *release();
+    // Konstruktor
+    GesamtSpielerStatistik();
+    // Destruktor
+    ~GesamtSpielerStatistik();
+    // nicht constant
+    void initValues( InitDatei *dat );
+    // constant
+    int getSpielerNummer() const;
+    Text *getSpielerName() const;
+    Text *zSpielerName() const;
+    Text *getTeamName() const;
+    Text *zTeamName() const;
+    int getSpielerFarbe() const;
+    int getTeamFarbe() const;
+    int getGewonneneRunden() const;
+    int getPunkte() const;
+    int getLinienLength() const;
+    int getZeitAmLeben() const;
+    int getZeitTod() const;
+    int getKills() const;
+    int getTode() const;
 };
 
 #endif

+ 36 - 51
Linie/GesamtTeamStatistik.cpp

@@ -3,103 +3,88 @@
 // Inhalt der GesamtTeamStatistik Klasse aus GesamtTeamStatistik.h
 // Konstruktor
 GesamtTeamStatistik::GesamtTeamStatistik()
+    : ReferenceCounter()
 {
-	teamNummer = 0;
-	teamName = new Text();
-	teamFarbe = 0;
-	gewonneneRunden = 0;
-	punkte = 0;
-	linienLength = 0;
-	kills = 0;
-	tode = 0;
-	ref = 1;
+    teamNummer = 0;
+    teamName = new Text();
+    teamFarbe = 0;
+    gewonneneRunden = 0;
+    punkte = 0;
+    linienLength = 0;
+    kills = 0;
+    tode = 0;
 }
 
 // Destruktor
 GesamtTeamStatistik::~GesamtTeamStatistik()
 {
-	teamName->release();
+    teamName->release();
 }
 
 // nicht constant
 void GesamtTeamStatistik::initValues( InitDatei *dat )
 {
-	if( dat->wertExistiert( "TeamNummer" ) )
-		teamNummer = *dat->zWert( "TeamNummer" );
-	if( dat->wertExistiert( "TeamName" ) )
-		*teamName = dat->zWert( "TeamName" )->getText();
-	if( dat->wertExistiert( "TeamFarbe" ) )
-		teamFarbe = *dat->zWert( "TeamFarbe" );
-	if( dat->wertExistiert( "GewonneneRunden" ) )
-		gewonneneRunden = *dat->zWert( "GewonneneRunden" );
-	if( dat->wertExistiert( "Punkte" ) )
-		punkte = *dat->zWert( "Punkte" );
-	if( dat->wertExistiert( "LinienLänge" ) )
-		linienLength = *dat->zWert( "LinienLänge" );
-	if( dat->wertExistiert( "Kills" ) )
-		kills = *dat->zWert( "Kills" );
-	if( dat->wertExistiert( "Tode" ) )
-		tode = *dat->zWert( "Tode" );
-	dat->release();
+    if( dat->wertExistiert( "TeamNummer" ) )
+        teamNummer = *dat->zWert( "TeamNummer" );
+    if( dat->wertExistiert( "TeamName" ) )
+        *teamName = dat->zWert( "TeamName" )->getText();
+    if( dat->wertExistiert( "TeamFarbe" ) )
+        teamFarbe = *dat->zWert( "TeamFarbe" );
+    if( dat->wertExistiert( "GewonneneRunden" ) )
+        gewonneneRunden = *dat->zWert( "GewonneneRunden" );
+    if( dat->wertExistiert( "Punkte" ) )
+        punkte = *dat->zWert( "Punkte" );
+    if( dat->wertExistiert( "LinienLänge" ) )
+        linienLength = *dat->zWert( "LinienLänge" );
+    if( dat->wertExistiert( "Kills" ) )
+        kills = *dat->zWert( "Kills" );
+    if( dat->wertExistiert( "Tode" ) )
+        tode = *dat->zWert( "Tode" );
+    dat->release();
 }
 
 // constant
 int GesamtTeamStatistik::getTeamNummer() const
 {
-	return teamNummer;
+    return teamNummer;
 }
 
 Text *GesamtTeamStatistik::getTeamName() const
 {
-	return teamName ? teamName->getThis() : 0;
+    return teamName ? dynamic_cast<Text *>( teamName->getThis() ) : 0;
 }
 
 Text *GesamtTeamStatistik::zTeamName() const
 {
-	return teamName;
+    return teamName;
 }
 
 int GesamtTeamStatistik::getTeamFarbe() const
 {
-	return teamFarbe;
+    return teamFarbe;
 }
 
 int GesamtTeamStatistik::getGewonneneRunden() const
 {
-	return gewonneneRunden;
+    return gewonneneRunden;
 }
 
 int GesamtTeamStatistik::getPunkte() const
 {
-	return punkte;
+    return punkte;
 }
 
 int GesamtTeamStatistik::getLinienLength() const
 {
-	return linienLength;
+    return linienLength;
 }
 
 int GesamtTeamStatistik::getKills() const
 {
-	return kills;
+    return kills;
 }
 
 int GesamtTeamStatistik::getTode() const
 {
-	return tode;
-}
-
-// Reference Counting
-GesamtTeamStatistik *GesamtTeamStatistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-GesamtTeamStatistik *GesamtTeamStatistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return tode;
 }

+ 25 - 29
Linie/GesamtTeamStatistik.h

@@ -6,39 +6,35 @@
 
 using namespace Framework;
 
-class GesamtTeamStatistik
+class GesamtTeamStatistik : public virtual ReferenceCounter
 {
 private:
-	int teamNummer;
-	Text *teamName;
-	int teamFarbe;
-	int gewonneneRunden;
-	int punkte;
-	int linienLength;
-	int kills;
-	int tode;
-	int ref;
+    int teamNummer;
+    Text *teamName;
+    int teamFarbe;
+    int gewonneneRunden;
+    int punkte;
+    int linienLength;
+    int kills;
+    int tode;
 
 public:
-	// Konstruktor
-	GesamtTeamStatistik();
-	// Destruktor
-	~GesamtTeamStatistik();
-	// nicht constant
-	void initValues( InitDatei *dat );
-	// constant
-	int getTeamNummer() const;
-	Text *getTeamName() const;
-	Text *zTeamName() const;
-	int getTeamFarbe() const;
-	int getGewonneneRunden() const;
-	int getPunkte() const;
-	int getLinienLength() const;
-	int getKills() const;
-	int getTode() const;
-	// Reference Counting
-	GesamtTeamStatistik *getThis();
-	GesamtTeamStatistik *release();
+    // Konstruktor
+    GesamtTeamStatistik();
+    // Destruktor
+    ~GesamtTeamStatistik();
+    // nicht constant
+    void initValues( InitDatei *dat );
+    // constant
+    int getTeamNummer() const;
+    Text *getTeamName() const;
+    Text *zTeamName() const;
+    int getTeamFarbe() const;
+    int getGewonneneRunden() const;
+    int getPunkte() const;
+    int getLinienLength() const;
+    int getKills() const;
+    int getTode() const;
 };
 
 #endif

+ 13 - 28
Linie/Karte.cpp

@@ -4,64 +4,49 @@
 // Inhalt der Karte Klasse aus Karte.h
 // Konstruktor
 Karte::Karte()
+    : ReferenceCounter()
 {
-	id = 0;
-	map = new Bild();
-	size = Punkt( 0, 0 );
-	ref = 1;
+    id = 0;
+    map = new Bild();
+    size = Punkt( 0, 0 );
 }
 
 // Destruktor
 Karte::~Karte()
 {
-	map->release();
+    map->release();
 }
 
 // nicht constant
 void Karte::setKarteId( int id )
 {
-	this->id = id;
+    this->id = id;
 }
 
 void Karte::setSize( int br, int hi )
 {
-	map->neuBild( br, hi, 0 );
-	size.x = br;
-	size.y = hi;
+    map->neuBild( br, hi, 0 );
+    size.x = br;
+    size.y = hi;
 }
 
 // constant
 int Karte::getKarteId() const
 {
-	return id;
+    return id;
 }
 
 int Karte::getBreite() const
 {
-	return size.x;
+    return size.x;
 }
 
 int Karte::getHeight() const
 {
-	return size.y;
+    return size.y;
 }
 
 Bild *Karte::zMap() const
 {
-	return ( map->getBreite() != 0 && map->getHeight() != 0 ) ? map : 0;
-}
-
-// Reference Counting
-Karte *Karte::getThis()
-{
-	ref++;
-	return this;
-}
-
-Karte *Karte::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return ( map->getBreite() != 0 && map->getHeight() != 0 ) ? map : 0;
 }

+ 16 - 20
Linie/Karte.h

@@ -5,30 +5,26 @@
 
 using namespace Framework;
 
-class Karte
+class Karte : public virtual ReferenceCounter
 {
 private:
-	int id;
-	Bild *map;
-	Punkt size;
-	int ref;
+    int id;
+    Bild *map;
+    Punkt size;
 
 public:
-	// Konstruktor
-	Karte();
-	// Destruktor
-	~Karte();
-	// nicht constant
-	void setKarteId( int id );
-	void setSize( int br, int hi );
-	// constant
-	int getKarteId() const;
-	int getBreite() const;
-	int getHeight( ) const;
-	Bild *zMap( ) const;
-	// Reference Counting
-	Karte *getThis();
-	Karte *release();
+    // Konstruktor
+    Karte();
+    // Destruktor
+    ~Karte();
+    // nicht constant
+    void setKarteId( int id );
+    void setSize( int br, int hi );
+    // constant
+    int getKarteId() const;
+    int getBreite() const;
+    int getHeight() const;
+    Bild *zMap() const;
 };
 
 #endif

+ 68 - 83
Linie/KartenLeser.cpp

@@ -4,111 +4,96 @@
 // Inhalt der KartenLeser Klasse aus KartenLeser.h
 // Kontruktor
 KartenLeser::KartenLeser( int karteId, SSDatenbankV *db, char *mapPfad )
+    : ReferenceCounter()
 {
-	this->karteId = karteId;
-	this->db = db;
-	pfad = new Text( mapPfad );
-	ref = 1;
+    this->karteId = karteId;
+    this->db = db;
+    pfad = new Text( mapPfad );
 }
 
 // Destruktor
 KartenLeser::~KartenLeser()
 {
-	db->release();
-	if( pfad )
-		pfad->release();
+    db->release();
+    if( pfad )
+        pfad->release();
 }
 
 // nicht constant
 bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *zSts )
 {
-	if( !pfad )
-		return 0;
-	Text *pf = new Text( pfad->getText() );
-	pf->append( "sts.ltgd" );
-	Datei *datei = new Datei();
-	datei->setDatei( pf );
-	if( !datei->existiert() || datei->istOrdner() )
-	{
-		datei->release();
-		return 0;
-	}
-	datei->open( Datei::Style::lesen );
-	datei->lese( (char*)&zSts->spielerAnzahl, 4 );
-	datei->lese( (char*)&zSts->teamAnzahl, 4 );
-	if( zSts->spielerFarbe )
-		zSts->spielerFarbe->release();
-	zSts->spielerFarbe = new Array< int >();
-	for( int i = 0; i < zSts->spielerAnzahl; i++ )
-	{
-		int farbe = 0;
-		datei->lese( (char*)&farbe, 4 );
-		zSts->spielerFarbe->set( farbe, i );
-	}
-	if( zSts->teamFarbe )
-		zSts->teamFarbe->release();
-	zSts->teamFarbe = new Array< int >();
-	for( int i = 0; i < zSts->teamAnzahl; i++ )
-	{
-		int farbe = 0;
-		datei->lese( (char*)&farbe, 4 );
-		zSts->teamFarbe->set( farbe, i );
-	}
-	if( zSts->teamName )
-		zSts->teamName->release();
-	zSts->teamName = new RCArray< Text >();
-	for( int i = 0; i < zSts->teamAnzahl; i++ )
-	{
-		char len = 0;
-		datei->lese( &len, 1 );
-		char *txt = new char[ len + 1 ];
-		txt[ (int)len ] = 0;
-		datei->lese( txt, len );
-		Text *name = new Text( txt );
-		delete[] txt;
-		zSts->teamName->set( name, i );
-	}
-	if( zSts->teamSize )
-		zSts->teamSize->release();
-	zSts->teamSize = new Array< int >();
-	for( int i = 0; i < zSts->teamAnzahl; i++ )
-	{
-		int size = 0;
-		datei->lese( (char*)&size, 4 );
-		zSts->teamSize->set( size, i );
-	}
-	datei->close();
-	datei->release();
-	return 1;
+    if( !pfad )
+        return 0;
+    Text *pf = new Text( pfad->getText() );
+    pf->append( "sts.ltgd" );
+    Datei *datei = new Datei();
+    datei->setDatei( pf );
+    if( !datei->existiert() || datei->istOrdner() )
+    {
+        datei->release();
+        return 0;
+    }
+    datei->open( Datei::Style::lesen );
+    datei->lese( (char *)&zSts->spielerAnzahl, 4 );
+    datei->lese( (char *)&zSts->teamAnzahl, 4 );
+    if( zSts->spielerFarbe )
+        zSts->spielerFarbe->release();
+    zSts->spielerFarbe = new Array< int >();
+    for( int i = 0; i < zSts->spielerAnzahl; i++ )
+    {
+        int farbe = 0;
+        datei->lese( (char *)&farbe, 4 );
+        zSts->spielerFarbe->set( farbe, i );
+    }
+    if( zSts->teamFarbe )
+        zSts->teamFarbe->release();
+    zSts->teamFarbe = new Array< int >();
+    for( int i = 0; i < zSts->teamAnzahl; i++ )
+    {
+        int farbe = 0;
+        datei->lese( (char *)&farbe, 4 );
+        zSts->teamFarbe->set( farbe, i );
+    }
+    if( zSts->teamName )
+        zSts->teamName->release();
+    zSts->teamName = new RCArray< Text >();
+    for( int i = 0; i < zSts->teamAnzahl; i++ )
+    {
+        char len = 0;
+        datei->lese( &len, 1 );
+        char *txt = new char[ len + 1 ];
+        txt[ (int)len ] = 0;
+        datei->lese( txt, len );
+        Text *name = new Text( txt );
+        delete[] txt;
+        zSts->teamName->set( name, i );
+    }
+    if( zSts->teamSize )
+        zSts->teamSize->release();
+    zSts->teamSize = new Array< int >();
+    for( int i = 0; i < zSts->teamAnzahl; i++ )
+    {
+        int size = 0;
+        datei->lese( (char *)&size, 4 );
+        zSts->teamSize->set( size, i );
+    }
+    datei->close();
+    datei->release();
+    return 1;
 }
 
 // constant
 int KartenLeser::getKarteId() const
 {
-	return karteId;
+    return karteId;
 }
 
 Text *KartenLeser::getPfad() const
 {
-	return pfad ? pfad->getThis() : 0;
+    return pfad ? dynamic_cast<Text *>( pfad->getThis() ) : 0;
 }
 
 Text *KartenLeser::zPfad() const
 {
-	return pfad;
-}
-
-// Reference Counting
-KartenLeser *KartenLeser::getThis()
-{
-	ref++;
-	return this;
-}
-
-KartenLeser *KartenLeser::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return pfad;
 }

+ 13 - 17
Linie/KartenLeser.h

@@ -4,28 +4,24 @@
 #include "SSDatenbankV.h"
 #include "Strukturen.h"
 
-class KartenLeser
+class KartenLeser : public virtual ReferenceCounter
 {
 private:
-	SSDatenbankV *db;
-	Text *pfad;
-	int karteId;
-	int ref;
+    SSDatenbankV *db;
+    Text *pfad;
+    int karteId;
 
 public:
-	// Kontruktor
+    // Kontruktor
     KartenLeser( int karteId, SSDatenbankV *db, char *mapPfad );
-	// Destruktor
-	~KartenLeser();
-	// nicht constant
-	bool ladeSpielerTeamStruktur( SpielerTeamStruktur *zSts );
-	// constant
-	int getKarteId() const;
-	Text *getPfad() const;
-	Text *zPfad() const;
-	// Reference Counting
-	KartenLeser *getThis();
-	KartenLeser *release();
+    // Destruktor
+    ~KartenLeser();
+    // nicht constant
+    bool ladeSpielerTeamStruktur( SpielerTeamStruktur *zSts );
+    // constant
+    int getKarteId() const;
+    Text *getPfad() const;
+    Text *zPfad() const;
 };
 
 #endif

+ 15 - 30
Linie/Klient.cpp

@@ -5,9 +5,9 @@
 // Inhalt der Klient Klasse aus Klient.h
 // Konstruktor
 Klient::Klient( SSKlientV *klient )
+    : ReferenceCounter()
 {
     this->klient = klient;
-    ref = 1;
 }
 
 // Destruktor
@@ -23,11 +23,11 @@ void Klient::offline()
     klient = (SSKlientV *)klient->release();
 }
 
-void Klient::online( SSKlientV * zKlient )
+void Klient::online( SSKlientV *zKlient )
 {
     if( klient )
         klient = (SSKlientV *)klient->release();
-    klient = (SSKlientV *)zKlient->getThis();
+    klient = dynamic_cast<SSKlientV *>( zKlient->getThis() );
 }
 
 void Klient::sendeSpielerNummer( int sNum, double spielZeit )
@@ -43,7 +43,7 @@ void Klient::sendeSpielerNummer( int sNum, double spielZeit )
     delete[] bytes;
 }
 
-void Klient::sendeInitSpieler( int anzahl, RCArray< Spieler > * zSpieler, double spielZeit )
+void Klient::sendeInitSpieler( int anzahl, RCArray< Spieler > *zSpieler, double spielZeit )
 {
     if( !klient )
         return;
@@ -64,7 +64,7 @@ void Klient::sendeInitSpieler( int anzahl, RCArray< Spieler > * zSpieler, double
     delete[] bytes;
 }
 
-void Klient::sendeSpielerPosition( Spieler * zSpieler, double spielZeit )
+void Klient::sendeSpielerPosition( Spieler *zSpieler, double spielZeit )
 {
     if( !klient )
         return;
@@ -105,7 +105,7 @@ void Klient::sendeStart( double spielZeit )
     delete[] bytes;
 }
 
-void Klient::sendeSpielerTod( Spieler * zSpieler, double spielZeit )
+void Klient::sendeSpielerTod( Spieler *zSpieler, double spielZeit )
 {
     if( !klient )
         return;
@@ -131,7 +131,7 @@ void Klient::sendeSpielEnde( char gewonnen, double spielZeit )
     delete[] bytes;
 }
 
-void Klient::sendeSpielerGeschwindigkeit( Spieler * zSpieler, double spielZeit )
+void Klient::sendeSpielerGeschwindigkeit( Spieler *zSpieler, double spielZeit )
 {
     if( !klient )
         return;
@@ -146,7 +146,7 @@ void Klient::sendeSpielerGeschwindigkeit( Spieler * zSpieler, double spielZeit )
     delete[] bytes;
 }
 
-void Klient::sendeSpielerWendigkeit( Spieler * zSpieler, double spielZeit )
+void Klient::sendeSpielerWendigkeit( Spieler *zSpieler, double spielZeit )
 {
     if( !klient )
         return;
@@ -329,7 +329,7 @@ void Klient::sendeStatistikSpielerOffline( int account )
     delete[] bytes;
 }
 
-void Klient::sendeGesamtSpielerStatistik( GesamtSpielerStatistik * zS )
+void Klient::sendeGesamtSpielerStatistik( GesamtSpielerStatistik *zS )
 {
     if( !zS || !klient )
         return;
@@ -358,7 +358,7 @@ void Klient::sendeGesamtSpielerStatistik( GesamtSpielerStatistik * zS )
     delete[] bytes;
 }
 
-void Klient::sendeGesamtTeamStatistik( GesamtTeamStatistik * zS )
+void Klient::sendeGesamtTeamStatistik( GesamtTeamStatistik *zS )
 {
     if( !zS || !klient )
         return;
@@ -380,7 +380,7 @@ void Klient::sendeGesamtTeamStatistik( GesamtTeamStatistik * zS )
     delete[] bytes;
 }
 
-void Klient::sendeRundeStatistik( RundenRundenStatistik * zS )
+void Klient::sendeRundeStatistik( RundenRundenStatistik *zS )
 {
     if( !zS || !klient )
         return;
@@ -394,7 +394,7 @@ void Klient::sendeRundeStatistik( RundenRundenStatistik * zS )
     *(int *)( bytes + 21 ) = zS->zRundenBild()->getHeight();
     klient->statistikNachricht( 25, bytes );
     delete[] bytes;
-    Bild * zB = zS->zRundenBild();
+    Bild *zB = zS->zRundenBild();
     int pixel = zB->getBreite() * zB->getHeight();
     while( pixel )
     {
@@ -406,7 +406,7 @@ void Klient::sendeRundeStatistik( RundenRundenStatistik * zS )
         *(int *)( bytes + 5 ) = pStart;
         *(int *)( bytes + 9 ) = pLen;
         for( int i = 0; i < pLen; i++ )
-            * (int *)( bytes + 13 + i * 4 ) = zB->getBuffer()[ pStart + i ];
+            *(int *)( bytes + 13 + i * 4 ) = zB->getBuffer()[ pStart + i ];
         klient->statistikNachricht( (short)( 13 + pLen * 4 ), bytes );
         delete[] bytes;
         pixel -= pLen;
@@ -419,7 +419,7 @@ void Klient::sendeRundeStatistik( RundenRundenStatistik * zS )
         sendeRundeTeamStatistik( zS->zTeamStatistik( i ), zS->getRundenNummer() );
 }
 
-void Klient::sendeRundeSpielerStatistik( RundenSpielerStatistik * zS, int runde )
+void Klient::sendeRundeSpielerStatistik( RundenSpielerStatistik *zS, int runde )
 {
     if( !zS || !klient )
         return;
@@ -445,7 +445,7 @@ void Klient::sendeRundeSpielerStatistik( RundenSpielerStatistik * zS, int runde
     delete[] bytes;
 }
 
-void Klient::sendeRundeTeamStatistik( RundenTeamStatistik * zS, int runde )
+void Klient::sendeRundeTeamStatistik( RundenTeamStatistik *zS, int runde )
 {
     if( !zS || !klient )
         return;
@@ -479,19 +479,4 @@ void Klient::sendeStatistikLadenFertig()
 bool Klient::istOnline() const
 {
     return klient != 0;
-}
-
-// reference Counting
-Klient *Klient::getThie()
-{
-    ref++;
-    return this;
-}
-
-Klient *Klient::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 39 - 43
Linie/Klient.h

@@ -11,53 +11,49 @@ using namespace Framework;
 
 class Spieler;
 
-class Klient
+class Klient : public virtual ReferenceCounter
 {
 private:
-	SSKlientV *klient;
-	int ref;
+    SSKlientV *klient;
 
 public:
-	// Konstruktor
-	Klient( SSKlientV *klient );
-	// Destruktor
-	~Klient();
-	// nicht constant
-	void offline();
-	void online( SSKlientV *zKlient );
-	void sendeSpielerNummer( int sNum, double spielZeit );
-	void sendeInitSpieler( int anzahl, RCArray< Spieler > *zSpieler, double spielZeit );
-	void sendeSpielerPosition( Spieler *zSpieler, double spielZeit );
-	void sendeKammeraSize( int br, int hi, double spielZeit );
-	void sendeStart( double spielZeit );
-	void sendeSpielerTod( Spieler *zSpieler, double spielZeit );
-	void sendeSpielEnde( char gewonnen, double spielZeit );
-	void sendeSpielerGeschwindigkeit( Spieler *zSpieler, double spielZeit );
-	void sendeSpielerWendigkeit( Spieler *zSpieler, double spielZeit );
-	void sendeSpielerKurve( int sNum, char kurve, double spielZeit );
-	void sendeKartenSize( int br, int hi, double spielZeit );
-	void sendeChatNachricht( char *txt, double spielZeit );
-	void sendeLinienUnterbrechung( int sNum, bool unterbrochen, double spielZeit );
-	void sendeTeamMaxPunkte( int team, int mP, double spielZeit );
-	void sendeTeamPunkte( int team, int p, double spielZeit );
-	void sendeSpielerPunkte( int sNum, int mP, double spielZeit );
-	void sendeTeamTod( int team, double spielZeit );
-	void sendeTeamName( int team, char *name );
-	void sendeRundenEnde( int winTeam, double spielZeit );
-	void sendeZeitVerbleibend( int sekunden, double spielZeit );
-	void sendeStatistikChatNachricht( int vonAccount, char *txt );
-	void sendeStatistikSpielerOffline( int account );
-	void sendeGesamtSpielerStatistik( GesamtSpielerStatistik *zS );
-	void sendeGesamtTeamStatistik( GesamtTeamStatistik *zS );
-	void sendeRundeStatistik( RundenRundenStatistik *zS );
-	void sendeRundeSpielerStatistik( RundenSpielerStatistik *zS, int runde );
-	void sendeRundeTeamStatistik( RundenTeamStatistik *zS, int runde );
-	void sendeStatistikLadenFertig();
-	// constant
-	bool istOnline() const;
-	// reference Counting
-	Klient *getThie();
-	Klient *release();
+    // Konstruktor
+    Klient( SSKlientV *klient );
+    // Destruktor
+    ~Klient();
+    // nicht constant
+    void offline();
+    void online( SSKlientV *zKlient );
+    void sendeSpielerNummer( int sNum, double spielZeit );
+    void sendeInitSpieler( int anzahl, RCArray< Spieler > *zSpieler, double spielZeit );
+    void sendeSpielerPosition( Spieler *zSpieler, double spielZeit );
+    void sendeKammeraSize( int br, int hi, double spielZeit );
+    void sendeStart( double spielZeit );
+    void sendeSpielerTod( Spieler *zSpieler, double spielZeit );
+    void sendeSpielEnde( char gewonnen, double spielZeit );
+    void sendeSpielerGeschwindigkeit( Spieler *zSpieler, double spielZeit );
+    void sendeSpielerWendigkeit( Spieler *zSpieler, double spielZeit );
+    void sendeSpielerKurve( int sNum, char kurve, double spielZeit );
+    void sendeKartenSize( int br, int hi, double spielZeit );
+    void sendeChatNachricht( char *txt, double spielZeit );
+    void sendeLinienUnterbrechung( int sNum, bool unterbrochen, double spielZeit );
+    void sendeTeamMaxPunkte( int team, int mP, double spielZeit );
+    void sendeTeamPunkte( int team, int p, double spielZeit );
+    void sendeSpielerPunkte( int sNum, int mP, double spielZeit );
+    void sendeTeamTod( int team, double spielZeit );
+    void sendeTeamName( int team, char *name );
+    void sendeRundenEnde( int winTeam, double spielZeit );
+    void sendeZeitVerbleibend( int sekunden, double spielZeit );
+    void sendeStatistikChatNachricht( int vonAccount, char *txt );
+    void sendeStatistikSpielerOffline( int account );
+    void sendeGesamtSpielerStatistik( GesamtSpielerStatistik *zS );
+    void sendeGesamtTeamStatistik( GesamtTeamStatistik *zS );
+    void sendeRundeStatistik( RundenRundenStatistik *zS );
+    void sendeRundeSpielerStatistik( RundenSpielerStatistik *zS, int runde );
+    void sendeRundeTeamStatistik( RundenTeamStatistik *zS, int runde );
+    void sendeStatistikLadenFertig();
+    // constant
+    bool istOnline() const;
 };
 
 #endif

+ 53 - 68
Linie/RundenRundenStatistik.cpp

@@ -4,148 +4,133 @@
 // Inhalt der RundenRundenStatistik Klasse aus RundenRundenStatistik.h
 // Konstruktor
 RundenRundenStatistik::RundenRundenStatistik()
+    : ReferenceCounter()
 {
-	rundenNummer = 0;
-	rundenDauer = 0;
-	siegerTeam = 0;
-	spielFeldNutzung = 0;
-	rundenBild = 0;
-	rss = new RCArray< RundenSpielerStatistik >();
-	rts = new RCArray< RundenTeamStatistik >();
-	ref = 1;
+    rundenNummer = 0;
+    rundenDauer = 0;
+    siegerTeam = 0;
+    spielFeldNutzung = 0;
+    rundenBild = 0;
+    rss = new RCArray< RundenSpielerStatistik >();
+    rts = new RCArray< RundenTeamStatistik >();
 }
 
 // Destruktor
 RundenRundenStatistik::~RundenRundenStatistik()
 {
-	if( rundenBild )
-		rundenBild->release();
-	rss->release();
-	rts->release();
+    if( rundenBild )
+        rundenBild->release();
+    rss->release();
+    rts->release();
 }
 
 // nciht constant
 void RundenRundenStatistik::addSpielerStatistik( RundenSpielerStatistik *rss )
 {
-	this->rss->add( rss );
+    this->rss->add( rss );
 }
 
 void RundenRundenStatistik::addTeamStatistik( RundenTeamStatistik *rts )
 {
-	this->rts->add( rts );
+    this->rts->add( rts );
 }
 
 void RundenRundenStatistik::setBild( Bild *b )
 {
-	if( rundenBild )
-		rundenBild->release();
-	rundenBild = b;
+    if( rundenBild )
+        rundenBild->release();
+    rundenBild = b;
 }
 
 void RundenRundenStatistik::initValues( InitDatei *dat )
 {
-	if( dat->wertExistiert( "RundenNummer" ) )
-		rundenNummer = *dat->zWert( "RundenNummer" );
-	if( dat->wertExistiert( "RundenDauer" ) )
-		rundenDauer = *dat->zWert( "RundenDauer" );
-	if( dat->wertExistiert( "SiegerTeam" ) )
-		siegerTeam = *dat->zWert( "SiegerTeam" );
-	if( dat->wertExistiert( "SpielFeldNutzung" ) )
-		spielFeldNutzung = *dat->zWert( "SpielFeldNutzung" );
-	dat->release();
+    if( dat->wertExistiert( "RundenNummer" ) )
+        rundenNummer = *dat->zWert( "RundenNummer" );
+    if( dat->wertExistiert( "RundenDauer" ) )
+        rundenDauer = *dat->zWert( "RundenDauer" );
+    if( dat->wertExistiert( "SiegerTeam" ) )
+        siegerTeam = *dat->zWert( "SiegerTeam" );
+    if( dat->wertExistiert( "SpielFeldNutzung" ) )
+        spielFeldNutzung = *dat->zWert( "SpielFeldNutzung" );
+    dat->release();
 }
 
 // constant
 InitDatei *RundenRundenStatistik::getValues() const
 {
-	InitDatei *ret = new InitDatei();
-	Text w;
-	w = rundenNummer;
-	if( w.getLength() )
-		ret->addWert( "RundenNummer", w.getText() );
-	w = rundenDauer;
-	if( w.getLength() )
-		ret->addWert( "RundenDauer", w.getText() );
-	w = siegerTeam;
-	if( w.getLength() )
-		ret->addWert( "SiegerTeam", w.getText() );
-	w = spielFeldNutzung;
-	if( w.getLength() )
-		ret->addWert( "SpielFeldNutzung", w.getText() );
-	return ret;
+    InitDatei *ret = new InitDatei();
+    Text w;
+    w = rundenNummer;
+    if( w.getLength() )
+        ret->addWert( "RundenNummer", w.getText() );
+    w = rundenDauer;
+    if( w.getLength() )
+        ret->addWert( "RundenDauer", w.getText() );
+    w = siegerTeam;
+    if( w.getLength() )
+        ret->addWert( "SiegerTeam", w.getText() );
+    w = spielFeldNutzung;
+    if( w.getLength() )
+        ret->addWert( "SpielFeldNutzung", w.getText() );
+    return ret;
 }
 
 int RundenRundenStatistik::getRundenNummer() const
 {
-	return rundenNummer;
+    return rundenNummer;
 }
 
 Bild *RundenRundenStatistik::getRundenBild() const
 {
-	return rundenBild ? rundenBild->getThis() : 0;
+    return rundenBild ? dynamic_cast<Bild *>( rundenBild->getThis() ) : 0;
 }
 
 Bild *RundenRundenStatistik::zRundenBild() const
 {
-	return rundenBild;
+    return rundenBild;
 }
 
 int RundenRundenStatistik::getRundenDauer() const
 {
-	return rundenDauer;
+    return rundenDauer;
 }
 
 int RundenRundenStatistik::getSiegerTeam() const
 {
-	return siegerTeam;
+    return siegerTeam;
 }
 
 int RundenRundenStatistik::getSpielFeldNutzung() const
 {
-	return spielFeldNutzung;
+    return spielFeldNutzung;
 }
 
 RundenSpielerStatistik *RundenRundenStatistik::getSpielerStatistik( int index ) const
 {
-	return rss->get( index );
+    return rss->get( index );
 }
 
 RundenSpielerStatistik *RundenRundenStatistik::zSpielerStatistik( int index ) const
 {
-	return rss->z( index );
+    return rss->z( index );
 }
 
 RundenTeamStatistik *RundenRundenStatistik::getTeamStatistik( int index ) const
 {
-	return rts->get( index );
+    return rts->get( index );
 }
 
 RundenTeamStatistik *RundenRundenStatistik::zTeamStatistik( int index ) const
 {
-	return rts->z( index );
+    return rts->z( index );
 }
 
 int RundenRundenStatistik::getSpielerAnzahl() const
 {
-	return rss->getEintragAnzahl();
+    return rss->getEintragAnzahl();
 }
 
 int RundenRundenStatistik::getTeamAnzahl() const
 {
-	return rts->getEintragAnzahl();
-}
-
-// Reference Counting
-RundenRundenStatistik *RundenRundenStatistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-RundenRundenStatistik *RundenRundenStatistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return rts->getEintragAnzahl();
 }

+ 31 - 35
Linie/RundenRundenStatistik.h

@@ -8,45 +8,41 @@
 
 using namespace Framework;
 
-class RundenRundenStatistik
+class RundenRundenStatistik : public virtual ReferenceCounter
 {
 private:
-	int rundenNummer;
-	int rundenDauer;
-	int siegerTeam;
-	int spielFeldNutzung;
-	Bild *rundenBild;
-	RCArray< RundenSpielerStatistik > *rss;
-	RCArray< RundenTeamStatistik > *rts;
-	int ref;
+    int rundenNummer;
+    int rundenDauer;
+    int siegerTeam;
+    int spielFeldNutzung;
+    Bild *rundenBild;
+    RCArray< RundenSpielerStatistik > *rss;
+    RCArray< RundenTeamStatistik > *rts;
 
 public:
-	// Konstruktor
-	RundenRundenStatistik();
-	// Destruktor
-	~RundenRundenStatistik();
-	// nciht constant
-	void addSpielerStatistik( RundenSpielerStatistik *rss );
-	void addTeamStatistik( RundenTeamStatistik *rts );
-	void setBild( Bild *b );
-	void initValues( InitDatei *dat );
-	// constant
-	InitDatei *getValues() const;
-	int getRundenNummer() const;
-	Bild *getRundenBild() const;
-	Bild *zRundenBild() const;
-	int getRundenDauer() const;
-	int getSiegerTeam() const;
-	int getSpielFeldNutzung() const;
-	RundenSpielerStatistik *getSpielerStatistik( int index ) const;
-	RundenSpielerStatistik *zSpielerStatistik( int index ) const;
-	RundenTeamStatistik *getTeamStatistik( int index ) const;
-	RundenTeamStatistik *zTeamStatistik( int index ) const;
-	int getSpielerAnzahl() const;
-	int getTeamAnzahl() const;
-	// Reference Counting
-	RundenRundenStatistik *getThis();
-	RundenRundenStatistik *release();
+    // Konstruktor
+    RundenRundenStatistik();
+    // Destruktor
+    ~RundenRundenStatistik();
+    // nciht constant
+    void addSpielerStatistik( RundenSpielerStatistik *rss );
+    void addTeamStatistik( RundenTeamStatistik *rts );
+    void setBild( Bild *b );
+    void initValues( InitDatei *dat );
+    // constant
+    InitDatei *getValues() const;
+    int getRundenNummer() const;
+    Bild *getRundenBild() const;
+    Bild *zRundenBild() const;
+    int getRundenDauer() const;
+    int getSiegerTeam() const;
+    int getSpielFeldNutzung() const;
+    RundenSpielerStatistik *getSpielerStatistik( int index ) const;
+    RundenSpielerStatistik *zSpielerStatistik( int index ) const;
+    RundenTeamStatistik *getTeamStatistik( int index ) const;
+    RundenTeamStatistik *zTeamStatistik( int index ) const;
+    int getSpielerAnzahl() const;
+    int getTeamAnzahl() const;
 };
 
 #endif

+ 38 - 53
Linie/RundenSpielerStatistik.cpp

@@ -3,109 +3,94 @@
 // Inhalt der RundenSpielerStatistik Klasse aus RundenSpielerStatistik.h
 // Konstruktor
 RundenSpielerStatistik::RundenSpielerStatistik()
+    : ReferenceCounter()
 {
-	spielerNummer = 0;
-	spielerName = new Text();
-	teamName = new Text();
-	spielerFarbe = 0;
-	teamFarbe = 0;
-	linienLength = 0;
-	kills = 0;
-	todeszeit = 0;
-	ref = 1;
+    spielerNummer = 0;
+    spielerName = new Text();
+    teamName = new Text();
+    spielerFarbe = 0;
+    teamFarbe = 0;
+    linienLength = 0;
+    kills = 0;
+    todeszeit = 0;
 }
 
 // Destruktor
 RundenSpielerStatistik::~RundenSpielerStatistik()
 {
-	spielerName->release();
-	teamName->release();
+    spielerName->release();
+    teamName->release();
 }
 
 // nicht constant
 void RundenSpielerStatistik::initValues( InitDatei *dat )
 {
-	if( dat->wertExistiert( "SpielerNummer" ) )
-		spielerNummer = *dat->zWert( "SpielerNummer" );
-	if( dat->wertExistiert( "SpielerName" ) )
-		*spielerName = dat->zWert( "SpielerName" )->getText();
-	if( dat->wertExistiert( "TeamName" ) )
-		*teamName = dat->zWert( "TeamName" )->getText();
-	if( dat->wertExistiert( "SpielerFarbe" ) )
-		spielerFarbe = *dat->zWert( "SpielerFarbe" );
-	if( dat->wertExistiert( "TeamFarbe" ) )
-		teamFarbe = *dat->zWert( "TeamFarbe" );
-	if( dat->wertExistiert( "LinienLänge" ) )
-		linienLength = *dat->zWert( "LinienLänge" );
-	if( dat->wertExistiert( "Kills" ) )
-		kills = *dat->zWert( "Kills" );
-	if( dat->wertExistiert( "Todeszeit" ) )
-		todeszeit = *dat->zWert( "Todeszeit" );
-	dat->release();
+    if( dat->wertExistiert( "SpielerNummer" ) )
+        spielerNummer = *dat->zWert( "SpielerNummer" );
+    if( dat->wertExistiert( "SpielerName" ) )
+        *spielerName = dat->zWert( "SpielerName" )->getText();
+    if( dat->wertExistiert( "TeamName" ) )
+        *teamName = dat->zWert( "TeamName" )->getText();
+    if( dat->wertExistiert( "SpielerFarbe" ) )
+        spielerFarbe = *dat->zWert( "SpielerFarbe" );
+    if( dat->wertExistiert( "TeamFarbe" ) )
+        teamFarbe = *dat->zWert( "TeamFarbe" );
+    if( dat->wertExistiert( "LinienLänge" ) )
+        linienLength = *dat->zWert( "LinienLänge" );
+    if( dat->wertExistiert( "Kills" ) )
+        kills = *dat->zWert( "Kills" );
+    if( dat->wertExistiert( "Todeszeit" ) )
+        todeszeit = *dat->zWert( "Todeszeit" );
+    dat->release();
 }
 
 // constant
 int RundenSpielerStatistik::getSpielerNummer() const
 {
-	return spielerNummer;
+    return spielerNummer;
 }
 
 Text *RundenSpielerStatistik::getSpielerName() const
 {
-	return spielerName ? spielerName->getThis() : 0;
+    return spielerName ? dynamic_cast<Text *>( spielerName->getThis() ) : 0;
 }
 
 Text *RundenSpielerStatistik::zSpielerName() const
 {
-	return spielerName;
+    return spielerName;
 }
 
 Text *RundenSpielerStatistik::getTeamName() const
 {
-	return teamName ? teamName->getThis() : 0;
+    return teamName ? dynamic_cast<Text *>( teamName->getThis() ) : 0;
 }
 
 Text *RundenSpielerStatistik::zTeamName() const
 {
-	return teamName;
+    return teamName;
 }
 
 int RundenSpielerStatistik::getSpielerFarbe() const
 {
-	return spielerFarbe;
+    return spielerFarbe;
 }
 
 int RundenSpielerStatistik::getTeamFarbe() const
 {
-	return teamFarbe;
+    return teamFarbe;
 }
 
 int RundenSpielerStatistik::getLinienLength() const
 {
-	return linienLength;
+    return linienLength;
 }
 
 int RundenSpielerStatistik::getKills() const
 {
-	return kills;
+    return kills;
 }
 
 int RundenSpielerStatistik::getTodesZeit() const
 {
-	return todeszeit;
-}
-
-// Reference Counting
-RundenSpielerStatistik *RundenSpielerStatistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-RundenSpielerStatistik *RundenSpielerStatistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return todeszeit;
 }

+ 26 - 30
Linie/RundenSpielerStatistik.h

@@ -6,40 +6,36 @@
 
 using namespace Framework;
 
-class RundenSpielerStatistik
+class RundenSpielerStatistik : public virtual ReferenceCounter
 {
 private:
-	int spielerNummer;
-	Text *spielerName;
-	Text *teamName;
-	int spielerFarbe;
-	int teamFarbe;
-	int linienLength;
-	int kills;
-	int todeszeit;
-	int ref;
+    int spielerNummer;
+    Text *spielerName;
+    Text *teamName;
+    int spielerFarbe;
+    int teamFarbe;
+    int linienLength;
+    int kills;
+    int todeszeit;
 
 public:
-	// Konstruktor
-	RundenSpielerStatistik();
-	// Destruktor
-	~RundenSpielerStatistik();
-	// nicht constant
-	void initValues( InitDatei *dat );
-	// constant
-	int getSpielerNummer() const;
-	Text *getSpielerName() const;
-	Text *zSpielerName() const;
-	Text *getTeamName() const;
-	Text *zTeamName() const;
-	int getSpielerFarbe() const;
-	int getTeamFarbe() const;
-	int getLinienLength() const;
-	int getKills() const;
-	int getTodesZeit() const;
-	// Reference Counting
-	RundenSpielerStatistik *getThis();
-	RundenSpielerStatistik *release();
+    // Konstruktor
+    RundenSpielerStatistik();
+    // Destruktor
+    ~RundenSpielerStatistik();
+    // nicht constant
+    void initValues( InitDatei *dat );
+    // constant
+    int getSpielerNummer() const;
+    Text *getSpielerName() const;
+    Text *zSpielerName() const;
+    Text *getTeamName() const;
+    Text *zTeamName() const;
+    int getSpielerFarbe() const;
+    int getTeamFarbe() const;
+    int getLinienLength() const;
+    int getKills() const;
+    int getTodesZeit() const;
 };
 
 #endif

+ 32 - 47
Linie/RundenTeamStatistik.cpp

@@ -3,95 +3,80 @@
 // Inhalt der RundenTeamStatistik Klasse aus RundenTeamStatistik.h
 // Konstruktor
 RundenTeamStatistik::RundenTeamStatistik()
+    : ReferenceCounter()
 {
-	teamNummer = 0;
-	teamName = new Text();
-	teamFarbe = 0;
-	ergebnis = 0;
-	linienLength = 0;
-	kills = 0;
-	tode = 0;
-	ref = 1;
+    teamNummer = 0;
+    teamName = new Text();
+    teamFarbe = 0;
+    ergebnis = 0;
+    linienLength = 0;
+    kills = 0;
+    tode = 0;
 }
 
 // Destruktor
 RundenTeamStatistik::~RundenTeamStatistik()
 {
-	teamName->release();
+    teamName->release();
 }
 
 // nicht constant
 void RundenTeamStatistik::initValues( InitDatei *dat )
 {
-	if( dat->wertExistiert( "TeamNummer" ) )
-		teamNummer = *dat->zWert( "TeamNummer" );
-	if( dat->wertExistiert( "TeamName" ) )
-		*teamName = dat->zWert( "TeamName" )->getText();
-	if( dat->wertExistiert( "TeamFarbe" ) )
-		teamFarbe = *dat->zWert( "TeamFarbe" );
-	if( dat->wertExistiert( "Ergebnis" ) )
-		ergebnis = *dat->zWert( "Ergebnis" );
-	if( dat->wertExistiert( "LinienLänge" ) )
-		linienLength = *dat->zWert( "LinienLänge" );
-	if( dat->wertExistiert( "Kills" ) )
-		kills = *dat->zWert( "Kills" );
-	if( dat->wertExistiert( "Tode" ) )
-		tode = *dat->zWert( "Tode" );
-	dat->release();
+    if( dat->wertExistiert( "TeamNummer" ) )
+        teamNummer = *dat->zWert( "TeamNummer" );
+    if( dat->wertExistiert( "TeamName" ) )
+        *teamName = dat->zWert( "TeamName" )->getText();
+    if( dat->wertExistiert( "TeamFarbe" ) )
+        teamFarbe = *dat->zWert( "TeamFarbe" );
+    if( dat->wertExistiert( "Ergebnis" ) )
+        ergebnis = *dat->zWert( "Ergebnis" );
+    if( dat->wertExistiert( "LinienLänge" ) )
+        linienLength = *dat->zWert( "LinienLänge" );
+    if( dat->wertExistiert( "Kills" ) )
+        kills = *dat->zWert( "Kills" );
+    if( dat->wertExistiert( "Tode" ) )
+        tode = *dat->zWert( "Tode" );
+    dat->release();
 }
 
 // constant
 int RundenTeamStatistik::getTeamNummer() const
 {
-	return teamNummer;
+    return teamNummer;
 }
 
 Text *RundenTeamStatistik::getTeamName() const
 {
-	return teamName ? teamName->getThis() : 0;
+    return teamName ? dynamic_cast<Text *>( teamName->getThis() ) : 0;
 }
 
 Text *RundenTeamStatistik::zTeamName() const
 {
-	return teamName;
+    return teamName;
 }
 
 int RundenTeamStatistik::getTeamFarbe() const
 {
-	return teamFarbe;
+    return teamFarbe;
 }
 
 int RundenTeamStatistik::getErgebnis() const
 {
-	return ergebnis;
+    return ergebnis;
 }
 
 int RundenTeamStatistik::getLinienLength() const
 {
-	return linienLength;
+    return linienLength;
 }
 
 int RundenTeamStatistik::getKills() const
 {
-	return kills;
+    return kills;
 }
 
 int RundenTeamStatistik::getTode() const
 {
-	return tode;
-}
-
-// Reference Counting
-RundenTeamStatistik *RundenTeamStatistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-RundenTeamStatistik *RundenTeamStatistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return tode;
 }

+ 23 - 27
Linie/RundenTeamStatistik.h

@@ -6,37 +6,33 @@
 
 using namespace Framework;
 
-class RundenTeamStatistik
+class RundenTeamStatistik : public virtual ReferenceCounter
 {
 private:
-	int teamNummer;
-	Text *teamName;
-	int teamFarbe;
-	int ergebnis;
-	int linienLength;
-	int kills;
-	int tode;
-	int ref;
+    int teamNummer;
+    Text *teamName;
+    int teamFarbe;
+    int ergebnis;
+    int linienLength;
+    int kills;
+    int tode;
 
 public:
-	// Konstruktor
-	RundenTeamStatistik();
-	// Destruktor
-	~RundenTeamStatistik();
-	// nicht constant
-	void initValues( InitDatei *dat );
-	// constant
-	int getTeamNummer() const;
-	Text *getTeamName() const;
-	Text *zTeamName() const;
-	int getTeamFarbe() const;
-	int getErgebnis() const;
-	int getLinienLength() const;
-	int getKills() const;
-	int getTode() const;
-	// Reference Counting
-	RundenTeamStatistik *getThis();
-	RundenTeamStatistik *release();
+    // Konstruktor
+    RundenTeamStatistik();
+    // Destruktor
+    ~RundenTeamStatistik();
+    // nicht constant
+    void initValues( InitDatei *dat );
+    // constant
+    int getTeamNummer() const;
+    Text *getTeamName() const;
+    Text *zTeamName() const;
+    int getTeamFarbe() const;
+    int getErgebnis() const;
+    int getLinienLength() const;
+    int getKills() const;
+    int getTode() const;
 };
 
 #endif

+ 12 - 17
Linie/SSDatenbankV.h

@@ -7,28 +7,23 @@
 
 using namespace Framework;
 
-class SSDatenbankV
+class SSDatenbankV : public virtual ReferenceCounter
 {
 private:
 
 public:
-	virtual ~SSDatenbankV()
-	{}
-	// nicht constant
-	virtual int getAccountId( int clientId ) = 0;
-	virtual Text *getSpielArtName( int spielId ) = 0;
-	virtual Text *getKarteName( int karteId ) = 0;
-	virtual int getSpielArtId( int karteId ) = 0;
-	virtual Text *getAccountRufName( int accountId ) = 0;
-	virtual bool setSpielStatusBeendet( int spielId, int status ) = 0;
-	virtual bool setSpielSpielerStatus( int spielId, int accountId, int punkte, int status ) = 0;
-	virtual bool addSpielerStatistik( int accountId, int spielId ) = 0;
+    virtual ~SSDatenbankV()
+    {}
+    // nicht constant
+    virtual int getAccountId( int clientId ) = 0;
+    virtual Text *getSpielArtName( int spielId ) = 0;
+    virtual Text *getKarteName( int karteId ) = 0;
+    virtual int getSpielArtId( int karteId ) = 0;
+    virtual Text *getAccountRufName( int accountId ) = 0;
+    virtual bool setSpielStatusBeendet( int spielId, int status ) = 0;
+    virtual bool setSpielSpielerStatus( int spielId, int accountId, int punkte, int status ) = 0;
+    virtual bool addSpielerStatistik( int accountId, int spielId ) = 0;
     virtual Text *getSpielPfad( int karteId ) = 0;
-	// constant
-
-	// Reference Counting
-	virtual SSDatenbankV *getThis() = 0;
-	virtual SSDatenbankV *release() = 0;
 };
 
 #endif

+ 677 - 692
Linie/Spiel.cpp

@@ -17,60 +17,60 @@
 // Inhalt der Spiel Klasse aus Spiel.h
 // Konstruktor
 Spiel::Spiel()
+    : ReferenceCounter()
 {
-	stat = new Statistik();
-	score = new Bestenliste();
-	teams = new Array< int >();
-	teamAnzahl = 0;
-	psqldb = 0;
-	spieler = new RCArray< Spieler >();
-	spielerAnzahl = 0;
-	spielId = 0;
-	karte = new Karte();
-	isRunning = 0;
-	sts = 0;
-	InitializeCriticalSection( &cs );
-	rundenAnzahl = 0;
-	spielZeit = 0;
-	ende = 1;
-	ref = 1;
+    stat = new Statistik();
+    score = new Bestenliste();
+    teams = new Array< int >();
+    teamAnzahl = 0;
+    psqldb = 0;
+    spieler = new RCArray< Spieler >();
+    spielerAnzahl = 0;
+    spielId = 0;
+    karte = new Karte();
+    isRunning = 0;
+    sts = 0;
+    InitializeCriticalSection( &cs );
+    rundenAnzahl = 0;
+    spielZeit = 0;
+    ende = 1;
 }
 
 // Destruktor
 Spiel::~Spiel()
 {
-	teams->release();
-	stat->release();
-	score->release();
-	spieler->release();
-	if( psqldb )
-		psqldb->release();
-	karte->release();
-	if( sts )
-		sts->release();
-	DeleteCriticalSection( &cs );
+    teams->release();
+    stat->release();
+    score->release();
+    spieler->release();
+    if( psqldb )
+        psqldb->release();
+    karte->release();
+    if( sts )
+        sts->release();
+    DeleteCriticalSection( &cs );
 }
 
 // nicht constant
 void Spiel::setPSQLK( SSDatenbankV *psqldb )
 {
-	if( this->psqldb )
-		this->psqldb->release();
-	this->psqldb = psqldb;
-	stat->setPSQLDB( psqldb->getThis() );
+    if( this->psqldb )
+        this->psqldb->release();
+    this->psqldb = psqldb;
+    stat->setPSQLDB( dynamic_cast<SSDatenbankV *>( psqldb->getThis() ) );
 }
 
 void Spiel::setSpielId( int id )
 {
-	spielId = id;
-	stat->setSpielId( id );
+    spielId = id;
+    stat->setSpielId( id );
 }
 
 void Spiel::setKarteId( int karteId )
 {
-	this->karteId = karteId;
-	karte->setKarteId( karteId );
-	stat->setKarteId( karteId );
+    this->karteId = karteId;
+    karte->setKarteId( karteId );
+    stat->setKarteId( karteId );
 }
 
 void Spiel::setTempPfad( char *pfad )
@@ -81,694 +81,679 @@ void Spiel::setTempPfad( char *pfad )
 
 void Spiel::setAccounts( int anzahl, Array< int > *zAccounts )
 {
-	spielerAnzahl = anzahl;
-	for( int i = 0; i < anzahl; i++ )
-	{
-		Spieler *tmp = new Spieler();
-		tmp->setAccountId( zAccounts->hat( i ) ? zAccounts->get( i ) : 0 );
-		spieler->set( tmp, i );
-	}
-	stat->setSpieler( spielerAnzahl, spieler );
+    spielerAnzahl = anzahl;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        Spieler *tmp = new Spieler();
+        tmp->setAccountId( zAccounts->hat( i ) ? zAccounts->get( i ) : 0 );
+        spieler->set( tmp, i );
+    }
+    stat->setSpieler( spielerAnzahl, spieler );
 }
 
 void Spiel::setKlients( int anzahl, RCArray< SSKlientV > *zKlients )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		Spieler *tmp = spieler->z( i );
-		if( tmp )
-			tmp->setKlient( new Klient( zKlients->get( i ) ) );
-	}
+    for( int i = 0; i < anzahl; i++ )
+    {
+        Spieler *tmp = spieler->z( i );
+        if( tmp )
+            tmp->setKlient( new Klient( zKlients->get( i ) ) );
+    }
 }
 
 void Spiel::setSpielerNummern( int anzahl, Array< int > *spielerNummern )
 {
-	if( !sts )
-	{
-		sts = new SpielerTeamStruktur();
-		KartenLeser *reader = new KartenLeser( karteId, psqldb->getThis(), mapPfad );
-		reader->ladeSpielerTeamStruktur( sts );
-		reader->release();
-		stat->setTeamNamen( sts->teamName->getThis() );
-	}
-	for( int i = 0; i < anzahl; i++ )
-	{
-		Spieler *tmp = spieler->z( i );
-		if( tmp )
-		{
-			int sNum = spielerNummern->hat( i ) ? spielerNummern->get( i ) : 0;
-			tmp->setSpielerNummer( sNum );
-			tmp->setSpielerFarbe( sts->spielerFarbe->hat( sNum ) ? sts->spielerFarbe->get( sNum ) : 0 );
-			int team = 0;
-			int von = 0;
-			int bis = 0;
-			for( int j = 0; j < sts->teamAnzahl; j++ )
-			{
-				bis = von + ( sts->teamSize->hat( j ) ? sts->teamSize->get( j ) : 0 );
-				if( sNum >= von && sNum < bis )
-				{
-					team = j;
-					break;
-				}
-				von = bis;
-			}
-			tmp->setTeam( team );
-			tmp->setTeamFarbe( sts->teamFarbe->hat( team ) ? sts->teamFarbe->get( team ) : 0 );
-		}
-	}
+    if( !sts )
+    {
+        sts = new SpielerTeamStruktur();
+        KartenLeser *reader = new KartenLeser( karteId, dynamic_cast<SSDatenbankV *>( psqldb->getThis() ), mapPfad );
+        reader->ladeSpielerTeamStruktur( sts );
+        reader->release();
+        stat->setTeamNamen( dynamic_cast<RCArray<Text> *>( sts->teamName->getThis() ) );
+    }
+    for( int i = 0; i < anzahl; i++ )
+    {
+        Spieler *tmp = spieler->z( i );
+        if( tmp )
+        {
+            int sNum = spielerNummern->hat( i ) ? spielerNummern->get( i ) : 0;
+            tmp->setSpielerNummer( sNum );
+            tmp->setSpielerFarbe( sts->spielerFarbe->hat( sNum ) ? sts->spielerFarbe->get( sNum ) : 0 );
+            int team = 0;
+            int von = 0;
+            int bis = 0;
+            for( int j = 0; j < sts->teamAnzahl; j++ )
+            {
+                bis = von + ( sts->teamSize->hat( j ) ? sts->teamSize->get( j ) : 0 );
+                if( sNum >= von && sNum < bis )
+                {
+                    team = j;
+                    break;
+                }
+                von = bis;
+            }
+            tmp->setTeam( team );
+            tmp->setTeamFarbe( sts->teamFarbe->hat( team ) ? sts->teamFarbe->get( team ) : 0 );
+        }
+    }
 }
 
 void Spiel::klientOffline( int accountId )
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( spieler->z( i )->getAccountId() == accountId )
-			spieler->z( i )->offline();
-	}
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( spieler->z( i )->getAccountId() == accountId )
+            spieler->z( i )->offline();
+    }
 }
 
 void Spiel::klientOnline( int accountId, SSKlientV *zKlient )
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( spieler->z( i )->getAccountId() == accountId )
-		{
-			EnterCriticalSection( &cs );
-			Spieler *s = spieler->z( i );
-			s->online( zKlient );
-			Klient *tmp = spieler->z( i )->zKlient();
-			tmp->sendeSpielerNummer( s->getSpielerNummer(), 0 );
-			tmp->sendeInitSpieler( spielerAnzahl, spieler, 0 );
-			tmp->sendeKammeraSize( 400, 400, 0 );
-			tmp->sendeKartenSize( karte->getBreite(), karte->getHeight(), 0 );
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				Spieler *z = spieler->z( i );
-				if( z )
-				{
-					tmp->sendeSpielerPosition( z, 0 );
-					tmp->sendeSpielerGeschwindigkeit( z, 0 );
-					tmp->sendeSpielerWendigkeit( z, 0 );
-				}
-			}
-			LeaveCriticalSection( &cs );
-		}
-	}
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( spieler->z( i )->getAccountId() == accountId )
+        {
+            EnterCriticalSection( &cs );
+            Spieler *s = spieler->z( i );
+            s->online( zKlient );
+            Klient *tmp = spieler->z( i )->zKlient();
+            tmp->sendeSpielerNummer( s->getSpielerNummer(), 0 );
+            tmp->sendeInitSpieler( spielerAnzahl, spieler, 0 );
+            tmp->sendeKammeraSize( 400, 400, 0 );
+            tmp->sendeKartenSize( karte->getBreite(), karte->getHeight(), 0 );
+            for( int i = 0; i < spielerAnzahl; i++ )
+            {
+                Spieler *z = spieler->z( i );
+                if( z )
+                {
+                    tmp->sendeSpielerPosition( z, 0 );
+                    tmp->sendeSpielerGeschwindigkeit( z, 0 );
+                    tmp->sendeSpielerWendigkeit( z, 0 );
+                }
+            }
+            LeaveCriticalSection( &cs );
+        }
+    }
 }
 
 void Spiel::nachricht( int accountId, int len, char *bytes )
 {
-	if( !isRunning || ende )
-		return;
-	EnterCriticalSection( &cs );
-	if( ende )
-	{
-		LeaveCriticalSection( &cs );
-		return;
-	}
-	char *msgBeg = bytes;
-	int msgLen = len;
-	int msgAccount = accountId;
-	bool saveMSG = 1;
-	len--;
-	switch( *bytes )
-	{
-	case 0: // Spieler drückt T_Links
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			Spieler *tmp = spieler->z( i );
-			if( tmp && tmp->getAccountId() == accountId )
-			{
-				if( !tmp->istAmLeben() )
-					break;
-				if( tmp->machtKurve( 0 ) )
-				{
-					saveMSG = 0;
-					break;
-				}
-				tmp->setLKurve( 1 );
-				for( int j = 0; j < spielerAnzahl; j++ )
-				{
-					Spieler *s = spieler->z( j );
-					if( s && s->zKlient() )
-						s->zKlient()->sendeSpielerKurve( tmp->getSpielerNummer(), 1, spielZeit );
-				}
-				break;
-			}
-		}
-		break;
-	case 1: // Spieler lässt T_Links los
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			Spieler *tmp = spieler->z( i );
-			if( tmp && tmp->getAccountId() == accountId )
-			{
-				if( !tmp->istAmLeben() )
-					break;
-				if( !tmp->machtKurve( 0 ) )
-				{
-					saveMSG = 0;
-					break;
-				}
-				tmp->setLKurve( 0 );
-				for( int j = 0; j < spielerAnzahl; j++ )
-				{
-					Spieler *s = spieler->z( j );
-					if( s && s->zKlient() )
-						s->zKlient()->sendeSpielerKurve( tmp->getSpielerNummer(), 2, spielZeit );
-				}
-				break;
-			}
-		}
-		break;
-	case 2: // Spieler drückt T_Rechts
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			Spieler *tmp = spieler->z( i );
-			if( tmp && tmp->getAccountId() == accountId )
-			{
-				if( !tmp->istAmLeben() )
-					break;
-				if( tmp->machtKurve( 1 ) )
-				{
-					saveMSG = 0;
-					break;
-				}
-				tmp->setRKurve( 1 );
-				for( int j = 0; j < spielerAnzahl; j++ )
-				{
-					Spieler *s = spieler->z( j );
-					if( s && s->zKlient() )
-						s->zKlient()->sendeSpielerKurve( tmp->getSpielerNummer(), 3, spielZeit );
-				}
-				break;
-			}
-		}
-		break;
-	case 3: // Spieler lässt T_Rechts los
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			Spieler *tmp = spieler->z( i );
-			if( tmp && tmp->getAccountId() == accountId )
-			{
-				if( !tmp->istAmLeben() )
-					break;
-				if( !tmp->machtKurve( 1 ) )
-				{
-					saveMSG = 0;
-					break;
-				}
-				tmp->setRKurve( 0 );
-				for( int j = 0; j < spielerAnzahl; j++ )
-				{
-					Spieler *s = spieler->z( j );
-					if( s && s->zKlient() )
-						s->zKlient()->sendeSpielerKurve( tmp->getSpielerNummer(), 4, spielZeit );
-				}
-				break;
-			}
-		}
-		break;
-	case 4: // chat Nachricht
-		if( 1 )
-		{
-			bytes++;
-			Text *txt = psqldb->getAccountRufName( accountId );
-			txt->append( ": " );
-			txt->append( bytes, len );
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				Spieler *tmp = spieler->z( i );
-				if( tmp && tmp->zKlient() )
-					tmp->zKlient()->sendeChatNachricht( txt->getText(), spielZeit );
-			}
-			txt->release();
-			len = 0;
-		}
-		break;
-	default:
-		saveMSG = 0;
-	}
-	if( len )
-	{
-		// error
-	}
-	if( log && log->istOffen() && saveMSG )
-	{
-		char c = 1;
-		log->schreibe( &c, 1 );
-		int spielerNum = 0;
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			Spieler *tmp = spieler->z( i );
-			if( tmp && tmp->getAccountId() == msgAccount )
-			{
-				spielerNum = tmp->getSpielerNummer();
-				break;
-			}
-		}
-		log->schreibe( (char*)&spielerNum, 4 );
-		short l = (short)msgLen;
-		log->schreibe( (char*)&l, 2 );
-		log->schreibe( msgBeg, l );
-	}
-	LeaveCriticalSection( &cs );
+    if( !isRunning || ende )
+        return;
+    EnterCriticalSection( &cs );
+    if( ende )
+    {
+        LeaveCriticalSection( &cs );
+        return;
+    }
+    char *msgBeg = bytes;
+    int msgLen = len;
+    int msgAccount = accountId;
+    bool saveMSG = 1;
+    len--;
+    switch( *bytes )
+    {
+    case 0: // Spieler drückt T_Links
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Spieler *tmp = spieler->z( i );
+            if( tmp && tmp->getAccountId() == accountId )
+            {
+                if( !tmp->istAmLeben() )
+                    break;
+                if( tmp->machtKurve( 0 ) )
+                {
+                    saveMSG = 0;
+                    break;
+                }
+                tmp->setLKurve( 1 );
+                for( int j = 0; j < spielerAnzahl; j++ )
+                {
+                    Spieler *s = spieler->z( j );
+                    if( s && s->zKlient() )
+                        s->zKlient()->sendeSpielerKurve( tmp->getSpielerNummer(), 1, spielZeit );
+                }
+                break;
+            }
+        }
+        break;
+    case 1: // Spieler lässt T_Links los
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Spieler *tmp = spieler->z( i );
+            if( tmp && tmp->getAccountId() == accountId )
+            {
+                if( !tmp->istAmLeben() )
+                    break;
+                if( !tmp->machtKurve( 0 ) )
+                {
+                    saveMSG = 0;
+                    break;
+                }
+                tmp->setLKurve( 0 );
+                for( int j = 0; j < spielerAnzahl; j++ )
+                {
+                    Spieler *s = spieler->z( j );
+                    if( s && s->zKlient() )
+                        s->zKlient()->sendeSpielerKurve( tmp->getSpielerNummer(), 2, spielZeit );
+                }
+                break;
+            }
+        }
+        break;
+    case 2: // Spieler drückt T_Rechts
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Spieler *tmp = spieler->z( i );
+            if( tmp && tmp->getAccountId() == accountId )
+            {
+                if( !tmp->istAmLeben() )
+                    break;
+                if( tmp->machtKurve( 1 ) )
+                {
+                    saveMSG = 0;
+                    break;
+                }
+                tmp->setRKurve( 1 );
+                for( int j = 0; j < spielerAnzahl; j++ )
+                {
+                    Spieler *s = spieler->z( j );
+                    if( s && s->zKlient() )
+                        s->zKlient()->sendeSpielerKurve( tmp->getSpielerNummer(), 3, spielZeit );
+                }
+                break;
+            }
+        }
+        break;
+    case 3: // Spieler lässt T_Rechts los
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Spieler *tmp = spieler->z( i );
+            if( tmp && tmp->getAccountId() == accountId )
+            {
+                if( !tmp->istAmLeben() )
+                    break;
+                if( !tmp->machtKurve( 1 ) )
+                {
+                    saveMSG = 0;
+                    break;
+                }
+                tmp->setRKurve( 0 );
+                for( int j = 0; j < spielerAnzahl; j++ )
+                {
+                    Spieler *s = spieler->z( j );
+                    if( s && s->zKlient() )
+                        s->zKlient()->sendeSpielerKurve( tmp->getSpielerNummer(), 4, spielZeit );
+                }
+                break;
+            }
+        }
+        break;
+    case 4: // chat Nachricht
+        if( 1 )
+        {
+            bytes++;
+            Text *txt = psqldb->getAccountRufName( accountId );
+            txt->append( ": " );
+            txt->append( bytes, len );
+            for( int i = 0; i < spielerAnzahl; i++ )
+            {
+                Spieler *tmp = spieler->z( i );
+                if( tmp && tmp->zKlient() )
+                    tmp->zKlient()->sendeChatNachricht( txt->getText(), spielZeit );
+            }
+            txt->release();
+            len = 0;
+        }
+        break;
+    default:
+        saveMSG = 0;
+    }
+    if( len )
+    {
+        // error
+    }
+    if( log && log->istOffen() && saveMSG )
+    {
+        char c = 1;
+        log->schreibe( &c, 1 );
+        int spielerNum = 0;
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Spieler *tmp = spieler->z( i );
+            if( tmp && tmp->getAccountId() == msgAccount )
+            {
+                spielerNum = tmp->getSpielerNummer();
+                break;
+            }
+        }
+        log->schreibe( (char *)&spielerNum, 4 );
+        short l = (short)msgLen;
+        log->schreibe( (char *)&l, 2 );
+        log->schreibe( msgBeg, l );
+    }
+    LeaveCriticalSection( &cs );
 }
 
 void Spiel::tick( double zeit )
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		Spieler *tmp = spieler->z( i );
-		if( tmp )
-		{
-			bool amLeben = tmp->istAmLeben();
-			bool lu = tmp->linieIstUnterbrochen();
-			tmp->tick( karte->zMap(), zeit );
-			if( amLeben != tmp->istAmLeben() || lu != tmp->linieIstUnterbrochen() )
-			{
-				if( lu != tmp->linieIstUnterbrochen() )
-				{
-					char c = 1;
-					log->schreibe( &c, 1 );
-					int sNum = tmp->getSpielerNummer();
-					log->schreibe( (char*)&sNum, 4 );
-					short len = 2;
-					log->schreibe( (char*)&len, 2 );
-					c = 5;
-					log->schreibe( &c, 1 );
-					c = (char)tmp->linieIstUnterbrochen();
-					log->schreibe( &c, 1 );
-				}
-				for( int j = 0; j < spielerAnzahl; j++ )
-				{
-					Spieler *s = spieler->z( j );
-					if( s && s->zKlient() )
-					{
-						if( amLeben && !tmp->istAmLeben() )
-						{
-							if( tmp->getKillFarbe() == s->getSpielerFarbe() )
-								s->addKill();
-							s->zKlient()->sendeSpielerTod( tmp, spielZeit );
-							if( s != tmp && s->istAmLeben() )
-							{
-								score->addSpielerPunkt( s->getSpielerNummer(), 1 );
-								s->addPunkte( 1 );
-							}
-						}
-						else if( lu != tmp->linieIstUnterbrochen() )
-							s->zKlient()->sendeLinienUnterbrechung( tmp->getSpielerNummer(), tmp->linieIstUnterbrochen(), spielZeit );
-					}
-				}
-				if( amLeben && !tmp->istAmLeben() )
-				{
-					int team = tmp->getSpielerTeam();
-					bool teamLebt = 0;
-					for( int k = 0; k < spielerAnzahl; k++ )
-					{
-						if( spieler->z( k ) && spieler->z( k )->getSpielerTeam() == team )
-							teamLebt |= spieler->z( k )->istAmLeben();
-					}
-					if( !teamLebt )
-					{
-						int teamAmLebenAnzahl = 0;
-						for( int k = 0; k < teamAnzahl; k++ )
-						{
-							int t = teams->hat( k ) ? teams->get( k ) : 0;
-							bool amLeben = 0;
-							for( int l = 0; l < spielerAnzahl; l++ )
-							{
-								if( spieler->z( l ) && spieler->z( l )->getSpielerTeam() == t )
-									amLeben |= spieler->z( l )->istAmLeben();
-							}
-							if( amLeben )
-							{
-								teamAmLebenAnzahl++;
-								score->addTeamPunkt( t, 1 );
-							}
-							else
-								score->addTeamPunkt( t, 0 );
-						}
-						if( teamAmLebenAnzahl <= 1 )
-							ende = 1;
-					}
-				}
-			}
-		}
-	}
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        Spieler *tmp = spieler->z( i );
+        if( tmp )
+        {
+            bool amLeben = tmp->istAmLeben();
+            bool lu = tmp->linieIstUnterbrochen();
+            tmp->tick( karte->zMap(), zeit );
+            if( amLeben != tmp->istAmLeben() || lu != tmp->linieIstUnterbrochen() )
+            {
+                if( lu != tmp->linieIstUnterbrochen() )
+                {
+                    char c = 1;
+                    log->schreibe( &c, 1 );
+                    int sNum = tmp->getSpielerNummer();
+                    log->schreibe( (char *)&sNum, 4 );
+                    short len = 2;
+                    log->schreibe( (char *)&len, 2 );
+                    c = 5;
+                    log->schreibe( &c, 1 );
+                    c = (char)tmp->linieIstUnterbrochen();
+                    log->schreibe( &c, 1 );
+                }
+                for( int j = 0; j < spielerAnzahl; j++ )
+                {
+                    Spieler *s = spieler->z( j );
+                    if( s && s->zKlient() )
+                    {
+                        if( amLeben && !tmp->istAmLeben() )
+                        {
+                            if( tmp->getKillFarbe() == s->getSpielerFarbe() )
+                                s->addKill();
+                            s->zKlient()->sendeSpielerTod( tmp, spielZeit );
+                            if( s != tmp && s->istAmLeben() )
+                            {
+                                score->addSpielerPunkt( s->getSpielerNummer(), 1 );
+                                s->addPunkte( 1 );
+                            }
+                        }
+                        else if( lu != tmp->linieIstUnterbrochen() )
+                            s->zKlient()->sendeLinienUnterbrechung( tmp->getSpielerNummer(), tmp->linieIstUnterbrochen(), spielZeit );
+                    }
+                }
+                if( amLeben && !tmp->istAmLeben() )
+                {
+                    int team = tmp->getSpielerTeam();
+                    bool teamLebt = 0;
+                    for( int k = 0; k < spielerAnzahl; k++ )
+                    {
+                        if( spieler->z( k ) && spieler->z( k )->getSpielerTeam() == team )
+                            teamLebt |= spieler->z( k )->istAmLeben();
+                    }
+                    if( !teamLebt )
+                    {
+                        int teamAmLebenAnzahl = 0;
+                        for( int k = 0; k < teamAnzahl; k++ )
+                        {
+                            int t = teams->hat( k ) ? teams->get( k ) : 0;
+                            bool amLeben = 0;
+                            for( int l = 0; l < spielerAnzahl; l++ )
+                            {
+                                if( spieler->z( l ) && spieler->z( l )->getSpielerTeam() == t )
+                                    amLeben |= spieler->z( l )->istAmLeben();
+                            }
+                            if( amLeben )
+                            {
+                                teamAmLebenAnzahl++;
+                                score->addTeamPunkt( t, 1 );
+                            }
+                            else
+                                score->addTeamPunkt( t, 0 );
+                        }
+                        if( teamAmLebenAnzahl <= 1 )
+                            ende = 1;
+                    }
+                }
+            }
+        }
+    }
 }
 
 void Spiel::run()
 {
-	log = new Datei();
-	Text *pfad = new Text( "../spiel log/" );
-	pfad->append( spielId );
-	pfad->append( "/verlauf.ksggl" );
-	log->setDatei( pfad );
-	log->remove();
-	log->erstellen();
-	log->open( Datei::Style::schreiben );
-	time_t t;
-	time( &t );
-	srand( (unsigned int)t );
-	log->schreibe( (char*)&spielerAnzahl, 4 );
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		Spieler *tmp = spieler->z( i );
-		if( tmp && tmp->zKlient() )
-		{
-			log->schreibe( (char*)&i, 4 );
-			int sNum = tmp->getSpielerNummer();
-			score->setSpielerPunkte( sNum, 0 );
-			log->schreibe( (char*)&sNum, 4 );
-			tmp->zKlient()->sendeSpielerNummer( sNum, 0 );
-			tmp->zKlient()->sendeInitSpieler( spielerAnzahl, spieler, 0 );
-			int kg = 400;
-			log->schreibe( (char*)&kg, 4 );
-			log->schreibe( (char*)&kg, 4 );
-			int team = tmp->getSpielerTeam();
-			log->schreibe( (char*)&team, 4 );
-			int farbe = tmp->getSpielerFarbe();
-			log->schreibe( (char*)&farbe, 4 );
-			farbe = tmp->getTeamFarbe();
-			log->schreibe( (char*)&farbe, 4 );
-			Text *name = psqldb->getAccountRufName( tmp->getAccountId() );
-			char len = (char)( name ? name->getLength() : 0 );
-			log->schreibe( &len, 1 );
-			if( len )
-				log->schreibe( name->getText(), len );
-			if( name )
-				name->release();
-			name = sts->teamName->z( tmp->getSpielerTeam() );
-			len = (char)( name ? name->getLength() : 0 );
-			log->schreibe( &len, 1 );
-			if( len )
-				log->schreibe( name->getText(), len );
-			tmp->zKlient()->sendeKammeraSize( 400, 400, 0 );
-			bool gefunden = 0;
-			for( int j = 0; j < teamAnzahl; j++ )
-				gefunden |= teams->hat( j ) && teams->get( j ) == tmp->getSpielerTeam();
-			if( !gefunden )
-			{
-				score->setTeamMaxPunkte( tmp->getSpielerTeam(), teamAnzahl * 3 );
-				score->setTeamPunkte( tmp->getSpielerTeam(), ( teamAnzahl * 3 ) / 2 );
-				teams->set( tmp->getSpielerTeam(), teamAnzahl );
-				teamAnzahl++;
-			}
-		}
-	}
-	for( int i = 0; i < teamAnzahl; i++ )
-	{
-		score->setTeamMaxPunkte( teams->hat( i ) ? teams->get( i ) : 0, teamAnzahl * 3 );
-		score->setTeamPunkte( teams->hat( i ) ? teams->get( i ) : 0, ( teamAnzahl * 3 ) / 2 );
-	}
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		Spieler *tmp = spieler->z( i );
-		if( tmp && tmp->zKlient() )
-		{
-			for( int j = 0; j < teamAnzahl; j++ )
-			{
-				int team = teams->hat( j ) ? teams->get( j ) : 0;
-				if( i == 0 )
-					log->schreibe( (char*)&team, 4 );
-				int p = score->getTeamMaxPunkte( team );
-				tmp->zKlient()->sendeTeamMaxPunkte( team, p, 0 );
-				if( i == 0 )
-					log->schreibe( (char*)&p, 4 );
-				p = score->getTeamPunkte( team );
-				tmp->zKlient()->sendeTeamPunkte( team, p, 0 );
-				if( i == 0 )
-					log->schreibe( (char*)&p, 4 );
-				if( sts->teamName->z( team ) )
-				    tmp->zKlient()->sendeTeamName( team, sts->teamName->z( team )->getText() );
-			}
-		}
-	}
-	Array< char > spielerStatus;
-	int gewinner = -1;
-	while( 1 )
-	{
-		rundenAnzahl++;
-		int karteBreite = 400 + ( rand() % ( spielerAnzahl * 50 ) );
-		int karteHeignt = 400 + ( rand() % ( spielerAnzahl * 50 ) );
-		karte->setSize( karteBreite, karteHeignt );
-		EnterCriticalSection( &cs );
-		log->schreibe( (char*)&karteBreite, 4 );
-		log->schreibe( (char*)&karteHeignt, 4 );
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			Spieler *tmp = spieler->z( i );
-			if( tmp && tmp->zKlient() )
-			{
-				tmp->zKlient()->sendeKartenSize( karteBreite, karteHeignt, 0 );
-				double w = 50.0 / 180 * PI;
-				log->schreibe( (char*)&w, 8 );
-				tmp->setWendigkeit( w );
-				tmp->setPosition( 100 + ( rand() % ( karteBreite - 200 ) ), 100 + ( rand() % ( karteHeignt - 200 ) ) );
-				double p = tmp->getX();
-				log->schreibe( (char*)&p, 8 );
-				p = tmp->getY();
-				log->schreibe( (char*)&p, 8 );
-				int grad = rand() % 180 - 90;
-				double xs = sin( grad / 180.0 * PI ) * 30;
-				log->schreibe( (char*)&xs, 8 );
-				double ys = sqrt( 30 * 30 - xs * xs );
-				ys *= ( rand() % 2 > 0 ) ? 1 : -1;
-				log->schreibe( (char*)&ys, 8 );
-				tmp->setGeschwindigkeit( xs, ys );
-			}
-		}
-		LeaveCriticalSection( &cs );
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			Spieler *tmp = spieler->z( i );
-			if( tmp )
-			{
-				for( int j = 0; j < spielerAnzahl; j++ )
-				{
-					Spieler *s = spieler->z( j );
-					if( s && s->zKlient() )
-					{
-						s->zKlient()->sendeSpielerPosition( tmp, 0 );
-						s->zKlient()->sendeSpielerGeschwindigkeit( tmp, 0 );
-						s->zKlient()->sendeSpielerWendigkeit( tmp, 0 );
-					}
-				}
-			}
-		}
-		for( int i = 0; i < teamAnzahl; i++ )
-		{
-			if( teams->hat( i ) && !score->istTeamAmLeben( teams->get( i ) ) )
-			{
-				for( int j = 0; j < spielerAnzahl; j++ )
-				{
-					Spieler *tmp = spieler->z( teams->get( i ) );
-					if( tmp )
-						tmp->zKlient()->sendeTeamTod( teams->get( i ), 0 );
-				}
-			}
-		}
-		ZeitMesser *zeit = new ZeitMesser();
-		zeit->messungStart();
-		isRunning = 1;
-		ende = 0;
-		double ausgleich = 0;
-		spielZeit = 0;
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			Spieler *tmp = spieler->z( i );
-			if( tmp && tmp->zKlient() )
-				tmp->zKlient()->sendeStart( 0 );
-		}
-		double rZeit = 0;
-		while( !ende )
-		{
-			zeit->messungEnde();
-			zeit->messungStart();
-			double z = zeit->getSekunden();
-			ausgleich += 1.0 / 25 - z;
-			if( ausgleich > 0 )
-				Sleep( (int)( ausgleich * 1000 ) );
-			rZeit += z;
-			while( spielZeit + TICK < rZeit && !ende )
-			{
-				EnterCriticalSection( &cs );
-				spielZeit += TICK;
-				char c = 0;
-				log->schreibe( &c, 1 );
-				tick( TICK );
-				LeaveCriticalSection( &cs );
-			}
-		}
-		zeit->messungEnde();
-		zeit->release();
-		gewinner = -1;
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			if( spieler->z( i )->istAmLeben() )
-			{
-				gewinner = spieler->z( i )->getSpielerTeam();
-				break;
-			}
-		}
-		if( gewinner < 0 )
-		{
-			double sterbeZeit = 0;
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				if( spieler->z( i )->getTodesZeit() >= sterbeZeit )
-				{
-					sterbeZeit = spieler->z( i )->getTodesZeit();
-					gewinner = spieler->z( i )->getSpielerTeam();
-				}
-			}
-		}
-		stat->rundenEnde( gewinner, (int)spielZeit, karte->zMap()->getThis() );
-		int winTeamAnzahl = 0;
-		Array< int > *winTeams = new Array< int >();
-		for( int i = 0; i < teamAnzahl; i++ )
-		{
-			if( score->hatTeamGewonnen( i ) || rundenAnzahl >= 10 )
-			{
-				winTeams->add( i, winTeamAnzahl );
-				winTeamAnzahl++;
-			}
-		}
-		if( !winTeamAnzahl )
-		{
-			int verloren = 0;
-			int team = -1;
-			for( int i = 0; i < teamAnzahl; i++ )
-			{
-				int t = teams->hat( i ) ? teams->get( i ) : 0;
-				if( !score->getTeamPunkte( t ) )
-					verloren++;
-				else
-					team = t;
-			}
-			if( verloren == teamAnzahl - 1 )
-			{
-				winTeams->add( team, winTeamAnzahl );
-				winTeamAnzahl++;
-			}
-		}
-		if( winTeamAnzahl > 1 )
-		{
-			int p = -1;
-			for( int i = 0; i < winTeamAnzahl; i++ )
-			{
-				int t = winTeams->hat( i ) ? winTeams->get( i ) : 0;
-				if( score->getTeamMaxPunkte( t ) - score->getTeamPunkte( t ) < p || p < 0 )
-				{
-					p = score->getTeamMaxPunkte( t ) - score->getTeamPunkte( t );
-					for( int j = 0; j < winTeamAnzahl; j++ )
-					{
-						int tt = winTeams->hat( j ) ? winTeams->get( j ) : 0;
-						if( score->getTeamMaxPunkte( tt ) - score->getTeamPunkte( tt ) > p )
-						{
-							if( i >= j )
-								i--;
-							score->setTeamPunkte( tt, 0 );
-							winTeams->remove( j );
-							winTeamAnzahl--;
-							j--;
-						}
-					}
-				}
-			}
-		}
-		if( ( !winTeamAnzahl || winTeamAnzahl > 1 ) && teamAnzahl > 1 && rundenAnzahl < 10 )
-		{
-			winTeams->release();
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				if( spieler->z( i ) && spieler->z( i )->zKlient() )
-				{
-					spieler->z( i )->neuRunde( score->getTeamPunkte( spieler->z( i )->getSpielerTeam() ) != 0 );
-					spieler->z( i )->zKlient()->sendeRundenEnde( gewinner, 0 );
-				}
-			}
-			for( int i = 5; i >= 0; i-- )
-			{
-				for( int k = 0; k < 10; k++ )
-				{
-					Sleep( 100 );
-					for( int j = 0; j < spielerAnzahl; j++ )
-					{
-						if( spieler->z( j ) && spieler->z( j )->zKlient() )
-							spieler->z( j )->zKlient()->sendeZeitVerbleibend( i, 0 );
-					}
-					if( !i )
-						break;
-				}
-			}
-		}
-		else
-		{
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				if( spieler->z( i ) && spieler->z( i )->zKlient() )
-				{
-					if( winTeams->getWertIndex( spieler->z( i )->getSpielerTeam() ) < 0 )
-					{
-						spielerStatus.set( 1, i ); // Datenbank Verloren
-						spieler->z( i )->zKlient()->sendeSpielEnde( 0, 0 );
-					}
-					else if( winTeamAnzahl > 1 )
-					{
-						spielerStatus.set( 5, i ); // Datenbank Unentschieden
-						spieler->z( i )->zKlient()->sendeSpielEnde( 2, 0 );
-					}
-					else
-					{
-						spielerStatus.set( 2, i ); // Datenbank Gewonnen
-						spieler->z( i )->zKlient()->sendeSpielEnde( 1, 0 );
-					}
-				}
-				if( spieler->z( i ) && ( !spieler->z( i )->zKlient() || !spieler->z( i )->istOnline() ) )
-					spielerStatus.set( 3, i );
-			}
-			winTeams->release();
-			break;
-		}
-	}
-	if( teamAnzahl == 1 )
-		psqldb->setSpielStatusBeendet( spielId, 6 );
-	else
-		psqldb->setSpielStatusBeendet( spielId, 5 );
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		Spieler *tmp = spieler->z( i );
-		if( tmp )
-		{
-			psqldb->setSpielSpielerStatus( spielId, tmp->getAccountId(), tmp->getPunkte(), spielerStatus.get( i ) );
-			if( teamAnzahl > 1 )
-				psqldb->addSpielerStatistik( tmp->getAccountId(), spielId );
-		}
-	}
-	log->close();
-	log = log->release();
-	isRunning = 0;
+    log = new Datei();
+    Text *pfad = new Text( "../spiel log/" );
+    pfad->append( spielId );
+    pfad->append( "/verlauf.ksggl" );
+    log->setDatei( pfad );
+    log->remove();
+    log->erstellen();
+    log->open( Datei::Style::schreiben );
+    time_t t;
+    time( &t );
+    srand( (unsigned int)t );
+    log->schreibe( (char *)&spielerAnzahl, 4 );
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        Spieler *tmp = spieler->z( i );
+        if( tmp && tmp->zKlient() )
+        {
+            log->schreibe( (char *)&i, 4 );
+            int sNum = tmp->getSpielerNummer();
+            score->setSpielerPunkte( sNum, 0 );
+            log->schreibe( (char *)&sNum, 4 );
+            tmp->zKlient()->sendeSpielerNummer( sNum, 0 );
+            tmp->zKlient()->sendeInitSpieler( spielerAnzahl, spieler, 0 );
+            int kg = 400;
+            log->schreibe( (char *)&kg, 4 );
+            log->schreibe( (char *)&kg, 4 );
+            int team = tmp->getSpielerTeam();
+            log->schreibe( (char *)&team, 4 );
+            int farbe = tmp->getSpielerFarbe();
+            log->schreibe( (char *)&farbe, 4 );
+            farbe = tmp->getTeamFarbe();
+            log->schreibe( (char *)&farbe, 4 );
+            Text *name = psqldb->getAccountRufName( tmp->getAccountId() );
+            char len = (char)( name ? name->getLength() : 0 );
+            log->schreibe( &len, 1 );
+            if( len )
+                log->schreibe( name->getText(), len );
+            if( name )
+                name->release();
+            name = sts->teamName->z( tmp->getSpielerTeam() );
+            len = (char)( name ? name->getLength() : 0 );
+            log->schreibe( &len, 1 );
+            if( len )
+                log->schreibe( name->getText(), len );
+            tmp->zKlient()->sendeKammeraSize( 400, 400, 0 );
+            bool gefunden = 0;
+            for( int j = 0; j < teamAnzahl; j++ )
+                gefunden |= teams->hat( j ) && teams->get( j ) == tmp->getSpielerTeam();
+            if( !gefunden )
+            {
+                score->setTeamMaxPunkte( tmp->getSpielerTeam(), teamAnzahl * 3 );
+                score->setTeamPunkte( tmp->getSpielerTeam(), ( teamAnzahl * 3 ) / 2 );
+                teams->set( tmp->getSpielerTeam(), teamAnzahl );
+                teamAnzahl++;
+            }
+        }
+    }
+    for( int i = 0; i < teamAnzahl; i++ )
+    {
+        score->setTeamMaxPunkte( teams->hat( i ) ? teams->get( i ) : 0, teamAnzahl * 3 );
+        score->setTeamPunkte( teams->hat( i ) ? teams->get( i ) : 0, ( teamAnzahl * 3 ) / 2 );
+    }
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        Spieler *tmp = spieler->z( i );
+        if( tmp && tmp->zKlient() )
+        {
+            for( int j = 0; j < teamAnzahl; j++ )
+            {
+                int team = teams->hat( j ) ? teams->get( j ) : 0;
+                if( i == 0 )
+                    log->schreibe( (char *)&team, 4 );
+                int p = score->getTeamMaxPunkte( team );
+                tmp->zKlient()->sendeTeamMaxPunkte( team, p, 0 );
+                if( i == 0 )
+                    log->schreibe( (char *)&p, 4 );
+                p = score->getTeamPunkte( team );
+                tmp->zKlient()->sendeTeamPunkte( team, p, 0 );
+                if( i == 0 )
+                    log->schreibe( (char *)&p, 4 );
+                if( sts->teamName->z( team ) )
+                    tmp->zKlient()->sendeTeamName( team, sts->teamName->z( team )->getText() );
+            }
+        }
+    }
+    Array< char > spielerStatus;
+    int gewinner = -1;
+    while( 1 )
+    {
+        rundenAnzahl++;
+        int karteBreite = 400 + ( rand() % ( spielerAnzahl * 50 ) );
+        int karteHeignt = 400 + ( rand() % ( spielerAnzahl * 50 ) );
+        karte->setSize( karteBreite, karteHeignt );
+        EnterCriticalSection( &cs );
+        log->schreibe( (char *)&karteBreite, 4 );
+        log->schreibe( (char *)&karteHeignt, 4 );
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Spieler *tmp = spieler->z( i );
+            if( tmp && tmp->zKlient() )
+            {
+                tmp->zKlient()->sendeKartenSize( karteBreite, karteHeignt, 0 );
+                double w = 50.0 / 180 * PI;
+                log->schreibe( (char *)&w, 8 );
+                tmp->setWendigkeit( w );
+                tmp->setPosition( 100 + ( rand() % ( karteBreite - 200 ) ), 100 + ( rand() % ( karteHeignt - 200 ) ) );
+                double p = tmp->getX();
+                log->schreibe( (char *)&p, 8 );
+                p = tmp->getY();
+                log->schreibe( (char *)&p, 8 );
+                int grad = rand() % 180 - 90;
+                double xs = sin( grad / 180.0 * PI ) * 30;
+                log->schreibe( (char *)&xs, 8 );
+                double ys = sqrt( 30 * 30 - xs * xs );
+                ys *= ( rand() % 2 > 0 ) ? 1 : -1;
+                log->schreibe( (char *)&ys, 8 );
+                tmp->setGeschwindigkeit( xs, ys );
+            }
+        }
+        LeaveCriticalSection( &cs );
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Spieler *tmp = spieler->z( i );
+            if( tmp )
+            {
+                for( int j = 0; j < spielerAnzahl; j++ )
+                {
+                    Spieler *s = spieler->z( j );
+                    if( s && s->zKlient() )
+                    {
+                        s->zKlient()->sendeSpielerPosition( tmp, 0 );
+                        s->zKlient()->sendeSpielerGeschwindigkeit( tmp, 0 );
+                        s->zKlient()->sendeSpielerWendigkeit( tmp, 0 );
+                    }
+                }
+            }
+        }
+        for( int i = 0; i < teamAnzahl; i++ )
+        {
+            if( teams->hat( i ) && !score->istTeamAmLeben( teams->get( i ) ) )
+            {
+                for( int j = 0; j < spielerAnzahl; j++ )
+                {
+                    Spieler *tmp = spieler->z( teams->get( i ) );
+                    if( tmp )
+                        tmp->zKlient()->sendeTeamTod( teams->get( i ), 0 );
+                }
+            }
+        }
+        ZeitMesser *zeit = new ZeitMesser();
+        zeit->messungStart();
+        isRunning = 1;
+        ende = 0;
+        double ausgleich = 0;
+        spielZeit = 0;
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Spieler *tmp = spieler->z( i );
+            if( tmp && tmp->zKlient() )
+                tmp->zKlient()->sendeStart( 0 );
+        }
+        double rZeit = 0;
+        while( !ende )
+        {
+            zeit->messungEnde();
+            zeit->messungStart();
+            double z = zeit->getSekunden();
+            ausgleich += 1.0 / 25 - z;
+            if( ausgleich > 0 )
+                Sleep( (int)( ausgleich * 1000 ) );
+            rZeit += z;
+            while( spielZeit + TICK < rZeit && !ende )
+            {
+                EnterCriticalSection( &cs );
+                spielZeit += TICK;
+                char c = 0;
+                log->schreibe( &c, 1 );
+                tick( TICK );
+                LeaveCriticalSection( &cs );
+            }
+        }
+        zeit->messungEnde();
+        zeit->release();
+        gewinner = -1;
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            if( spieler->z( i )->istAmLeben() )
+            {
+                gewinner = spieler->z( i )->getSpielerTeam();
+                break;
+            }
+        }
+        if( gewinner < 0 )
+        {
+            double sterbeZeit = 0;
+            for( int i = 0; i < spielerAnzahl; i++ )
+            {
+                if( spieler->z( i )->getTodesZeit() >= sterbeZeit )
+                {
+                    sterbeZeit = spieler->z( i )->getTodesZeit();
+                    gewinner = spieler->z( i )->getSpielerTeam();
+                }
+            }
+        }
+        stat->rundenEnde( gewinner, (int)spielZeit, dynamic_cast<Bild *>( karte->zMap()->getThis() ) );
+        int winTeamAnzahl = 0;
+        Array< int > *winTeams = new Array< int >();
+        for( int i = 0; i < teamAnzahl; i++ )
+        {
+            if( score->hatTeamGewonnen( i ) || rundenAnzahl >= 10 )
+            {
+                winTeams->add( i, winTeamAnzahl );
+                winTeamAnzahl++;
+            }
+        }
+        if( !winTeamAnzahl )
+        {
+            int verloren = 0;
+            int team = -1;
+            for( int i = 0; i < teamAnzahl; i++ )
+            {
+                int t = teams->hat( i ) ? teams->get( i ) : 0;
+                if( !score->getTeamPunkte( t ) )
+                    verloren++;
+                else
+                    team = t;
+            }
+            if( verloren == teamAnzahl - 1 )
+            {
+                winTeams->add( team, winTeamAnzahl );
+                winTeamAnzahl++;
+            }
+        }
+        if( winTeamAnzahl > 1 )
+        {
+            int p = -1;
+            for( int i = 0; i < winTeamAnzahl; i++ )
+            {
+                int t = winTeams->hat( i ) ? winTeams->get( i ) : 0;
+                if( score->getTeamMaxPunkte( t ) - score->getTeamPunkte( t ) < p || p < 0 )
+                {
+                    p = score->getTeamMaxPunkte( t ) - score->getTeamPunkte( t );
+                    for( int j = 0; j < winTeamAnzahl; j++ )
+                    {
+                        int tt = winTeams->hat( j ) ? winTeams->get( j ) : 0;
+                        if( score->getTeamMaxPunkte( tt ) - score->getTeamPunkte( tt ) > p )
+                        {
+                            if( i >= j )
+                                i--;
+                            score->setTeamPunkte( tt, 0 );
+                            winTeams->remove( j );
+                            winTeamAnzahl--;
+                            j--;
+                        }
+                    }
+                }
+            }
+        }
+        if( ( !winTeamAnzahl || winTeamAnzahl > 1 ) && teamAnzahl > 1 && rundenAnzahl < 10 )
+        {
+            winTeams->release();
+            for( int i = 0; i < spielerAnzahl; i++ )
+            {
+                if( spieler->z( i ) && spieler->z( i )->zKlient() )
+                {
+                    spieler->z( i )->neuRunde( score->getTeamPunkte( spieler->z( i )->getSpielerTeam() ) != 0 );
+                    spieler->z( i )->zKlient()->sendeRundenEnde( gewinner, 0 );
+                }
+            }
+            for( int i = 5; i >= 0; i-- )
+            {
+                for( int k = 0; k < 10; k++ )
+                {
+                    Sleep( 100 );
+                    for( int j = 0; j < spielerAnzahl; j++ )
+                    {
+                        if( spieler->z( j ) && spieler->z( j )->zKlient() )
+                            spieler->z( j )->zKlient()->sendeZeitVerbleibend( i, 0 );
+                    }
+                    if( !i )
+                        break;
+                }
+            }
+        }
+        else
+        {
+            for( int i = 0; i < spielerAnzahl; i++ )
+            {
+                if( spieler->z( i ) && spieler->z( i )->zKlient() )
+                {
+                    if( winTeams->getWertIndex( spieler->z( i )->getSpielerTeam() ) < 0 )
+                    {
+                        spielerStatus.set( 1, i ); // Datenbank Verloren
+                        spieler->z( i )->zKlient()->sendeSpielEnde( 0, 0 );
+                    }
+                    else if( winTeamAnzahl > 1 )
+                    {
+                        spielerStatus.set( 5, i ); // Datenbank Unentschieden
+                        spieler->z( i )->zKlient()->sendeSpielEnde( 2, 0 );
+                    }
+                    else
+                    {
+                        spielerStatus.set( 2, i ); // Datenbank Gewonnen
+                        spieler->z( i )->zKlient()->sendeSpielEnde( 1, 0 );
+                    }
+                }
+                if( spieler->z( i ) && ( !spieler->z( i )->zKlient() || !spieler->z( i )->istOnline() ) )
+                    spielerStatus.set( 3, i );
+            }
+            winTeams->release();
+            break;
+        }
+    }
+    if( teamAnzahl == 1 )
+        psqldb->setSpielStatusBeendet( spielId, 6 );
+    else
+        psqldb->setSpielStatusBeendet( spielId, 5 );
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        Spieler *tmp = spieler->z( i );
+        if( tmp )
+        {
+            psqldb->setSpielSpielerStatus( spielId, tmp->getAccountId(), tmp->getPunkte(), spielerStatus.get( i ) );
+            if( teamAnzahl > 1 )
+                psqldb->addSpielerStatistik( tmp->getAccountId(), spielId );
+        }
+    }
+    log->close();
+    log = (Datei *)log->release();
+    isRunning = 0;
 }
 
 // constant
 StatistikV *Spiel::getStatistik() const
 {
-	return stat->getThis();
-}
-
-// Reference Counting 
-SpielKlasse *Spiel::getThis()
-{
-	ref++;
-	return this;
-}
-
-SpielKlasse *Spiel::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return dynamic_cast<StatistikV *>( stat->getThis() );
 }

+ 34 - 38
Linie/Spiel.h

@@ -14,49 +14,45 @@ class StatistikV;
 class Spiel : public SpielKlasse
 {
 private:
-	Statistik *stat;
-	Bestenliste *score;
-	Array< int > *teams;
-	int teamAnzahl;
-	RCArray< Spieler > *spieler;
-	SSDatenbankV *psqldb;
-	int spielId;
-	int karteId;
-	int spielerAnzahl;
-	Karte *karte;
-	CRITICAL_SECTION cs;
-	SpielerTeamStruktur *sts;
-	Datei *log;
-	bool isRunning;
-	int rundenAnzahl;
-	double spielZeit;
-	bool ende;
+    Statistik *stat;
+    Bestenliste *score;
+    Array< int > *teams;
+    int teamAnzahl;
+    RCArray< Spieler > *spieler;
+    SSDatenbankV *psqldb;
+    int spielId;
+    int karteId;
+    int spielerAnzahl;
+    Karte *karte;
+    CRITICAL_SECTION cs;
+    SpielerTeamStruktur *sts;
+    Datei *log;
+    bool isRunning;
+    int rundenAnzahl;
+    double spielZeit;
+    bool ende;
     Text mapPfad;
-	int ref;
 
 public:
-	// Konstruktor
-	Spiel();
-	// Destruktor
-	~Spiel();
-	// nicht constant
-	virtual void setPSQLK( SSDatenbankV *psqldb );
-	virtual void setSpielId( int id );
+    // Konstruktor
+    Spiel();
+    // Destruktor
+    ~Spiel();
+    // nicht constant
+    virtual void setPSQLK( SSDatenbankV *psqldb );
+    virtual void setSpielId( int id );
     virtual void setKarteId( int karteId );
     virtual void setTempPfad( char *pfad );
-	virtual void setAccounts( int anzahl, Array< int > *zAccounts );
-	virtual void setKlients( int anzahl, RCArray< SSKlientV > *zKlients );
-	virtual void setSpielerNummern( int anzahl, Array< int > *spielerNummern );
-	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();
-	// constant
-	virtual StatistikV *getStatistik() const;
-	// Reference Counting 
-	virtual SpielKlasse *getThis();
-	virtual SpielKlasse *release();
+    virtual void setAccounts( int anzahl, Array< int > *zAccounts );
+    virtual void setKlients( int anzahl, RCArray< SSKlientV > *zKlients );
+    virtual void setSpielerNummern( int anzahl, Array< int > *spielerNummern );
+    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();
+    // constant
+    virtual StatistikV *getStatistik() const;
 };
 
 #endif

+ 15 - 19
Linie/SpielKlasse.h

@@ -8,31 +8,27 @@
 
 using namespace Framework;
 
-class SpielKlasse
+class SpielKlasse : public virtual ReferenceCounter
 {
 private:
 
 public:
-	virtual ~SpielKlasse()
-	{
-	}
-	// nicht constant
-	virtual void setPSQLK( SSDatenbankV *psqldb ) = 0;
-	virtual void setSpielId( int id ) = 0;
+    virtual ~SpielKlasse()
+    {	}
+    // nicht constant
+    virtual void setPSQLK( SSDatenbankV *psqldb ) = 0;
+    virtual void setSpielId( int id ) = 0;
     virtual void setKarteId( int karteId ) = 0;
     virtual void setTempPfad( char *pfad ) = 0;
-	virtual void setAccounts( int anzahl, Array< int > *zAccounts ) = 0;
-	virtual void setKlients( int anzahl, RCArray< SSKlientV > *zKlients ) = 0;
-	virtual void setSpielerNummern( int anzahl, Array< int > *spielerNummern ) = 0;
-	virtual void klientOffline( int accountId ) = 0;
-	virtual void klientOnline( int accountId, SSKlientV *zKlient ) = 0;
-	virtual void nachricht( int accountId, int len, char *bytes ) = 0;
-	virtual void run() = 0;
-	// constant
-	virtual StatistikV *getStatistik() const = 0;
-	// Reference Counting 
-	virtual SpielKlasse *getThis() = 0;
-	virtual SpielKlasse *release() = 0;
+    virtual void setAccounts( int anzahl, Array< int > *zAccounts ) = 0;
+    virtual void setKlients( int anzahl, RCArray< SSKlientV > *zKlients ) = 0;
+    virtual void setSpielerNummern( int anzahl, Array< int > *spielerNummern ) = 0;
+    virtual void klientOffline( int accountId ) = 0;
+    virtual void klientOnline( int accountId, SSKlientV *zKlient ) = 0;
+    virtual void nachricht( int accountId, int len, char *bytes ) = 0;
+    virtual void run() = 0;
+    // constant
+    virtual StatistikV *getStatistik() const = 0;
 };
 
 #endif

+ 223 - 238
Linie/Spieler.cpp

@@ -9,243 +9,215 @@
 // Inhalt der Spieler Klasse aus Spieler.h
 // Konstruktor
 Spieler::Spieler()
-{
-	accountId = 0;
-	sNum = 0;
-	team = 0;
-	spielerFarbe = 0;
-	teamFarbe = 0;
-	xPos = 0;
-	yPos = 0;
-	xSpeed = 0;
-	ySpeed = 0;
-	kurve = 0;
-	radius = 1;
-	amLeben = 1;
-	lKurve = 0;
-	rKurve = 0;
-	klient = 0;
-	spielZeit = 0;
-	todesZeit = -1;
-	linieUnterbrochen = 1;
-	nLUChange = 3;
-	lUStrength = 0.3;
-	punkte = 0;
-	rundenGewonnen = 0;
-	linienLength = 0;
-	zeitAmLeben = 0;
-	zeitTod = 0;
-	kills = 0;
-	tode = 0;
-	killFarbe = 0;
-	rundenLinienLength = new Array< int >();
-	rundenLinienLength->set( 0, 0 );
-	rundenKills = new Array< int >();
-	rundenKills->set( 0, 0 );
-	rundenTodesZeit = new Array< int >();
-	rundenTodesZeit->set( 0, 0 );
-	rundenNummer = 0;
-	ref = 1;
+    : ReferenceCounter()
+{
+    accountId = 0;
+    sNum = 0;
+    team = 0;
+    spielerFarbe = 0;
+    teamFarbe = 0;
+    xPos = 0;
+    yPos = 0;
+    xSpeed = 0;
+    ySpeed = 0;
+    kurve = 0;
+    radius = 1;
+    amLeben = 1;
+    lKurve = 0;
+    rKurve = 0;
+    klient = 0;
+    spielZeit = 0;
+    todesZeit = -1;
+    linieUnterbrochen = 1;
+    nLUChange = 3;
+    lUStrength = 0.3;
+    punkte = 0;
+    rundenGewonnen = 0;
+    linienLength = 0;
+    zeitAmLeben = 0;
+    zeitTod = 0;
+    kills = 0;
+    tode = 0;
+    killFarbe = 0;
+    rundenLinienLength = new Array< int >();
+    rundenLinienLength->set( 0, 0 );
+    rundenKills = new Array< int >();
+    rundenKills->set( 0, 0 );
+    rundenTodesZeit = new Array< int >();
+    rundenTodesZeit->set( 0, 0 );
+    rundenNummer = 0;
 }
 
 // Destruktor
 Spieler::~Spieler()
 {
-	if( klient )
-		klient->release();
-	rundenLinienLength->release();
-	rundenKills->release();
-	rundenTodesZeit->release();
+    if( klient )
+        klient->release();
+    rundenLinienLength->release();
+    rundenKills->release();
+    rundenTodesZeit->release();
 }
 
 // nicht constant
 void Spieler::offline()
 {
-	klient->offline();
+    klient->offline();
 }
 
 void Spieler::online( SSKlientV *zKlient )
 {
-	klient->online( zKlient );
+    klient->online( zKlient );
 }
 
 void Spieler::neuRunde( bool amLeben )
 {
-	if( this->amLeben )
-		rundenGewonnen++;
-	killFarbe = 0;
-	xPos = 0;
-	yPos = 0;
-	xSpeed = 0;
-	ySpeed = 0;
-	kurve = 0;
-	radius = 1;
-	this->amLeben = amLeben;
-	lKurve = 0;
-	rKurve = 0;
-	spielZeit = 0;
-	todesZeit = -1;
-	linieUnterbrochen = 1;
-	nLUChange = 3;
-	lUStrength = 0.3;
-	rundenNummer++;
-	rundenLinienLength->set( 0, rundenNummer );
-	rundenKills->set( 0, rundenNummer );
-	rundenTodesZeit->set( 0, rundenNummer );
+    if( this->amLeben )
+        rundenGewonnen++;
+    killFarbe = 0;
+    xPos = 0;
+    yPos = 0;
+    xSpeed = 0;
+    ySpeed = 0;
+    kurve = 0;
+    radius = 1;
+    this->amLeben = amLeben;
+    lKurve = 0;
+    rKurve = 0;
+    spielZeit = 0;
+    todesZeit = -1;
+    linieUnterbrochen = 1;
+    nLUChange = 3;
+    lUStrength = 0.3;
+    rundenNummer++;
+    rundenLinienLength->set( 0, rundenNummer );
+    rundenKills->set( 0, rundenNummer );
+    rundenTodesZeit->set( 0, rundenNummer );
 }
 
 void Spieler::setAccountId( int id )
 {
-	accountId = id;
+    accountId = id;
 }
 
 void Spieler::setSpielerNummer( int sNum )
 {
-	this->sNum = sNum;
+    this->sNum = sNum;
 }
 
 void Spieler::setTeam( int team )
 {
-	this->team = team;
+    this->team = team;
 }
 
 void Spieler::setSpielerFarbe( int farbe )
 {
-	spielerFarbe = farbe;
+    spielerFarbe = farbe;
 }
 
 void Spieler::setTeamFarbe( int farbe )
 {
-	teamFarbe = farbe;
+    teamFarbe = farbe;
 }
 
 void Spieler::setGeschwindigkeit( double xSpeed, double ySpeed )
 {
-	this->xSpeed = xSpeed;
-	this->ySpeed = ySpeed;
+    this->xSpeed = xSpeed;
+    this->ySpeed = ySpeed;
 }
 
 void Spieler::setPosition( double x, double y )
 {
-	xPos = x;
-	yPos = y;
+    xPos = x;
+    yPos = y;
 }
 
 void Spieler::setWendigkeit( double kurve )
 {
-	this->kurve = kurve;
+    this->kurve = kurve;
 }
 
 void Spieler::setSize( int radius )
 {
-	this->radius = radius;
+    this->radius = radius;
 }
 
 void Spieler::setKlient( Klient *klient )
 {
-	if( this->klient )
-		this->klient->release();
-	this->klient = klient;
+    if( this->klient )
+        this->klient->release();
+    this->klient = klient;
 }
 
 void Spieler::setLKurve( bool lK )
 {
-	lKurve = lK;
+    lKurve = lK;
 }
 
 void Spieler::setRKurve( bool rK )
 {
-	rKurve = rK;
+    rKurve = rK;
 }
 
 void Spieler::setLinienUnterbrechungsStrength( double uS )
 {
-	lUStrength = uS;
+    lUStrength = uS;
 }
 
 void Spieler::addPunkte( int p )
 {
-	punkte += p;
+    punkte += p;
 }
 
 void Spieler::addKill()
 {
-	kills++;
-	if( rundenKills->hat( rundenNummer ) )
-		rundenKills->set( rundenKills->get( rundenNummer ) + 1, rundenNummer );
+    kills++;
+    if( rundenKills->hat( rundenNummer ) )
+        rundenKills->set( rundenKills->get( rundenNummer ) + 1, rundenNummer );
 }
 
 void Spieler::tick( Bild *zMap, double zeit )
 {
-	spielZeit += zeit;
-	if( amLeben )
-	{
-		zeitAmLeben += zeit;
-		if( lKurve || rKurve )
-		{
-			double grad = kurve * zeit;
-			if( lKurve )
-				grad = -grad;
-			double cs = cos( grad );
-			double sn = sin( grad );
-			double tmpX = ( xSpeed * cs - ySpeed * sn );
-			double tmpY = ( xSpeed * sn + ySpeed * cs );
-			xSpeed = tmpX;
-			ySpeed = tmpY;
-		}
-		if( zMap && !linieUnterbrochen )
-		{
-			int x1 = (int)( xPos + 0.5 );
-			int y1 = (int)( yPos + 0.5 );
-			int x2 = (int)( xPos + xSpeed * zeit + 0.5 );
-			int y2 = (int)( yPos + ySpeed * zeit + 0.5 );
-			int *buff = zMap->getBuffer();
-			int dpx = 0;
-			int dpy = 0;
-			int dgx = zMap->getBreite();
-			int dgy = zMap->getHeight();
-			int xlen = x2 - x1, axlen = abs( xlen );
-			int ylen = y2 - y1, aylen = abs( ylen );
-			double xf = (double)xlen / ( aylen ? aylen : 1 );
-			double yf = (double)ylen / ( axlen ? axlen : 1 );
-			if( axlen > aylen )
-				xf = xf < 0 ? -1 : 1;
-			else
-				yf = yf < 0 ? -1 : 1;
-			double x = (double)x1, y = (double)y1;
-			int maxP = (int)( sqrt( (double)( xlen * xlen + ylen * ylen ) ) + 0.5 );
-			int count = 0;
-			int lastX = (int)( x + 0.5 ), lastY = (int)( y + 0.5 );
-			while( !( (int)( x + 0.5 ) == x2 && (int)( y + 0.5 ) == y2 ) && count < maxP )
-			{
-				if( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy )
-				{
-					if( !rundenTodesZeit->hat( rundenNummer ) || !rundenTodesZeit->get( rundenNummer ) )
-						tode++;
-					xPos = x;
-					yPos = y;
-					todesZeit = spielZeit;
-					rundenTodesZeit->set( (int)todesZeit, rundenNummer );
-					amLeben = 0;
-					killFarbe = 0;
-					break;
-				}
-				if( buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] )
-				{
-					killFarbe = buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ];
-					if( killFarbe == spielerFarbe )
-						killFarbe = 0;
-					if( !rundenTodesZeit->hat( rundenNummer ) || !rundenTodesZeit->get( rundenNummer ) )
-						tode++;
-					xPos = x;
-					yPos = y;
-					todesZeit = spielZeit;
-					rundenTodesZeit->set( (int)todesZeit, rundenNummer );
-					amLeben = 0;
-					break;
-				}
-				buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] = spielerFarbe;
-				x += xf, y += yf;
+    spielZeit += zeit;
+    if( amLeben )
+    {
+        zeitAmLeben += zeit;
+        if( lKurve || rKurve )
+        {
+            double grad = kurve * zeit;
+            if( lKurve )
+                grad = -grad;
+            double cs = cos( grad );
+            double sn = sin( grad );
+            double tmpX = ( xSpeed * cs - ySpeed * sn );
+            double tmpY = ( xSpeed * sn + ySpeed * cs );
+            xSpeed = tmpX;
+            ySpeed = tmpY;
+        }
+        if( zMap && !linieUnterbrochen )
+        {
+            int x1 = (int)( xPos + 0.5 );
+            int y1 = (int)( yPos + 0.5 );
+            int x2 = (int)( xPos + xSpeed * zeit + 0.5 );
+            int y2 = (int)( yPos + ySpeed * zeit + 0.5 );
+            int *buff = zMap->getBuffer();
+            int dpx = 0;
+            int dpy = 0;
+            int dgx = zMap->getBreite();
+            int dgy = zMap->getHeight();
+            int xlen = x2 - x1, axlen = abs( xlen );
+            int ylen = y2 - y1, aylen = abs( ylen );
+            double xf = (double)xlen / ( aylen ? aylen : 1 );
+            double yf = (double)ylen / ( axlen ? axlen : 1 );
+            if( axlen > aylen )
+                xf = xf < 0 ? -1 : 1;
+            else
+                yf = yf < 0 ? -1 : 1;
+            double x = (double)x1, y = (double)y1;
+            int maxP = (int)( sqrt( (double)( xlen * xlen + ylen * ylen ) ) + 0.5 );
+            int count = 0;
+            int lastX = (int)( x + 0.5 ), lastY = (int)( y + 0.5 );
+            while( !( (int)( x + 0.5 ) == x2 && (int)( y + 0.5 ) == y2 ) && count < maxP )
+            {
                 if( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy )
                 {
                     if( !rundenTodesZeit->hat( rundenNummer ) || !rundenTodesZeit->get( rundenNummer ) )
@@ -258,196 +230,209 @@ void Spieler::tick( Bild *zMap, double zeit )
                     killFarbe = 0;
                     break;
                 }
-				if( ( lastX != (int)( x + 0.5 ) || lastY != (int)( y + 0.5 ) ) && !buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] )
-				{
-					linienLength++;
-					if( rundenLinienLength->hat( rundenNummer ) )
-						rundenLinienLength->set( rundenLinienLength->get( rundenNummer ) + 1, rundenNummer );
-				}
-				if( lastX != (int)( x + 0.5 ) && lastY != (int)( yf + 0.5 ) )
-				{
-					if( (int)xf )
-					{
-						if( !( lastX < dpx || lastX >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy ) )
-							buff[ lastX + (int)( y + 0.5 ) * zMap->getBreite() ] = spielerFarbe;
-					}
-					else
-					{
-						if( !( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || lastY < dpy || lastY >= dgy ) )
-							buff[ (int)( x + 0.5 ) + lastY * zMap->getBreite() ] = spielerFarbe;
-					}
-				}
-				lastX = (int)( x + 0.5 );
-				lastY = (int)( y + 0.5 );
-				count++;
-			}
-		}
-		if( amLeben )
-		{
-			xPos += xSpeed * zeit;
-			yPos += ySpeed * zeit;
-			nLUChange -= zeit;
-			if( nLUChange <= 0 )
-			{
-				linieUnterbrochen = !linieUnterbrochen;
-				if( linieUnterbrochen )
-					nLUChange = lUStrength;
-				else
-					nLUChange = 1 / lUStrength + ( ( rand() % (int)( 1 / lUStrength ) ) - ( ( 1 / lUStrength ) / 2 ) );
-			}
-		}
-	}
-	else
-		zeitTod += zeit;
+                if( buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] )
+                {
+                    killFarbe = buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ];
+                    if( killFarbe == spielerFarbe )
+                        killFarbe = 0;
+                    if( !rundenTodesZeit->hat( rundenNummer ) || !rundenTodesZeit->get( rundenNummer ) )
+                        tode++;
+                    xPos = x;
+                    yPos = y;
+                    todesZeit = spielZeit;
+                    rundenTodesZeit->set( (int)todesZeit, rundenNummer );
+                    amLeben = 0;
+                    break;
+                }
+                buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] = spielerFarbe;
+                x += xf, y += yf;
+                if( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy )
+                {
+                    if( !rundenTodesZeit->hat( rundenNummer ) || !rundenTodesZeit->get( rundenNummer ) )
+                        tode++;
+                    xPos = x;
+                    yPos = y;
+                    todesZeit = spielZeit;
+                    rundenTodesZeit->set( (int)todesZeit, rundenNummer );
+                    amLeben = 0;
+                    killFarbe = 0;
+                    break;
+                }
+                if( ( lastX != (int)( x + 0.5 ) || lastY != (int)( y + 0.5 ) ) && !buff[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * zMap->getBreite() ] )
+                {
+                    linienLength++;
+                    if( rundenLinienLength->hat( rundenNummer ) )
+                        rundenLinienLength->set( rundenLinienLength->get( rundenNummer ) + 1, rundenNummer );
+                }
+                if( lastX != (int)( x + 0.5 ) && lastY != (int)( yf + 0.5 ) )
+                {
+                    if( (int)xf )
+                    {
+                        if( !( lastX < dpx || lastX >= dgx || (int)( y + 0.5 ) < dpy || (int)( y + 0.5 ) >= dgy ) )
+                            buff[ lastX + (int)( y + 0.5 ) * zMap->getBreite() ] = spielerFarbe;
+                    }
+                    else
+                    {
+                        if( !( (int)( x + 0.5 ) < dpx || (int)( x + 0.5 ) >= dgx || lastY < dpy || lastY >= dgy ) )
+                            buff[ (int)( x + 0.5 ) + lastY * zMap->getBreite() ] = spielerFarbe;
+                    }
+                }
+                lastX = (int)( x + 0.5 );
+                lastY = (int)( y + 0.5 );
+                count++;
+            }
+        }
+        if( amLeben )
+        {
+            xPos += xSpeed * zeit;
+            yPos += ySpeed * zeit;
+            nLUChange -= zeit;
+            if( nLUChange <= 0 )
+            {
+                linieUnterbrochen = !linieUnterbrochen;
+                if( linieUnterbrochen )
+                    nLUChange = lUStrength;
+                else
+                    nLUChange = 1 / lUStrength + ( ( rand() % (int)( 1 / lUStrength ) ) - ( ( 1 / lUStrength ) / 2 ) );
+            }
+        }
+    }
+    else
+        zeitTod += zeit;
 }
 
 // constant
 Klient *Spieler::zKlient() const
 {
-	return klient;
+    return klient;
 }
 
 int Spieler::getSpielerNummer() const
 {
-	return sNum;
+    return sNum;
 }
 
 int Spieler::getSpielerFarbe() const
 {
-	return spielerFarbe;
+    return spielerFarbe;
 }
 
 int Spieler::getSpielerTeam() const
 {
-	return team;
+    return team;
 }
 
 int Spieler::getTeamFarbe() const
 {
-	return teamFarbe;
+    return teamFarbe;
 }
 
 double Spieler::getX() const
 {
-	return xPos;
+    return xPos;
 }
 
 double Spieler::getY() const
 {
-	return yPos;
+    return yPos;
 }
 
 double Spieler::getSpeedX() const
 {
-	return xSpeed;
+    return xSpeed;
 }
 
 double Spieler::getSpeedY() const
 {
-	return ySpeed;
+    return ySpeed;
 }
 
 double Spieler::getKurve() const
 {
-	return kurve;
+    return kurve;
 }
 
 bool Spieler::istAmLeben() const
 {
-	return amLeben;
+    return amLeben;
 }
 
 int Spieler::getAccountId() const
 {
-	return accountId;
+    return accountId;
 }
 
 double Spieler::getTodesZeit() const
 {
-	return todesZeit;
+    return todesZeit;
 }
 
 bool Spieler::linieIstUnterbrochen() const
 {
-	return linieUnterbrochen;
+    return linieUnterbrochen;
 }
 
 int Spieler::getPunkte() const
 {
-	return punkte;
+    return punkte;
 }
 
 bool Spieler::istOnline() const
 {
-	return klient ? klient->istOnline() : 0;
+    return klient ? klient->istOnline() : 0;
 }
 
 int Spieler::getKillFarbe() const
 {
-	return killFarbe;
+    return killFarbe;
 }
 
 int Spieler::getRundenGewonnen() const
 {
-	return rundenGewonnen + amLeben;
+    return rundenGewonnen + amLeben;
 }
 
 int Spieler::getLinienLength() const
 {
-	return linienLength;
+    return linienLength;
 }
 
 int Spieler::getZeitAmLeben() const
 {
-	return (int)zeitAmLeben;
+    return (int)zeitAmLeben;
 }
 
 int Spieler::getZeitTod() const
 {
-	return (int)zeitTod;
+    return (int)zeitTod;
 }
 
 int Spieler::getKills() const
 {
-	return kills;
+    return kills;
 }
 
 int Spieler::getTode() const
 {
-	return tode;
+    return tode;
 }
 
 int Spieler::getLinienLength( int runde ) const
 {
-	return rundenLinienLength->hat( runde ) ? rundenLinienLength->get( runde ) : 0;
+    return rundenLinienLength->hat( runde ) ? rundenLinienLength->get( runde ) : 0;
 }
 
 int Spieler::getKills( int runde ) const
 {
-	return rundenKills->hat( runde ) ? rundenKills->get( runde ) : 0;
+    return rundenKills->hat( runde ) ? rundenKills->get( runde ) : 0;
 }
 
 int Spieler::getTodesZeit( int runde ) const
 {
-	return rundenTodesZeit->hat( runde ) ? rundenTodesZeit->get( runde ) : 0;
+    return rundenTodesZeit->hat( runde ) ? rundenTodesZeit->get( runde ) : 0;
 }
 
 bool Spieler::machtKurve( bool rechts ) const
 {
-	return ( rechts && rKurve ) || ( !rechts && lKurve );
-}
-
-// Reference Counting
-Spieler *Spieler::getThis()
-{
-	ref++;
-	return this;
-}
-
-Spieler *Spieler::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return ( rechts && rKurve ) || ( !rechts && lKurve );
 }

+ 85 - 89
Linie/Spieler.h

@@ -4,99 +4,95 @@
 #include "Klient.h"
 #include <Bild.h>
 
-class Spieler
+class Spieler : public virtual ReferenceCounter
 {
 private:
-	int accountId;
-	int sNum;
-	int team;
-	int spielerFarbe;
-	int teamFarbe;
-	double xPos;
-	double yPos;
-	double xSpeed;
-	double ySpeed;
-	double kurve;
-	int radius;
-	bool amLeben;
-	bool lKurve;
-	bool rKurve;
-	double spielZeit;
-	double todesZeit;
-	bool linieUnterbrochen;
-	double nLUChange;
-	double lUStrength;
-	int punkte;
-	int rundenGewonnen;
-	int linienLength;
-	double zeitAmLeben;
-	double zeitTod;
-	int kills;
-	int tode;
-	int killFarbe;
-	Array< int > *rundenLinienLength;
-	Array< int > *rundenKills;
-	Array< int > *rundenTodesZeit;
-	int rundenNummer;
-	Klient *klient;
-	int ref;
+    int accountId;
+    int sNum;
+    int team;
+    int spielerFarbe;
+    int teamFarbe;
+    double xPos;
+    double yPos;
+    double xSpeed;
+    double ySpeed;
+    double kurve;
+    int radius;
+    bool amLeben;
+    bool lKurve;
+    bool rKurve;
+    double spielZeit;
+    double todesZeit;
+    bool linieUnterbrochen;
+    double nLUChange;
+    double lUStrength;
+    int punkte;
+    int rundenGewonnen;
+    int linienLength;
+    double zeitAmLeben;
+    double zeitTod;
+    int kills;
+    int tode;
+    int killFarbe;
+    Array< int > *rundenLinienLength;
+    Array< int > *rundenKills;
+    Array< int > *rundenTodesZeit;
+    int rundenNummer;
+    Klient *klient;
 
 public:
-	// Konstruktor
-	Spieler();
-	// Destruktor
-	~Spieler();
-	// nicht constant
-	void offline();
-	void online( SSKlientV *zKlient );
-	void neuRunde( bool amLeben );
-	void setAccountId( int id );
-	void setSpielerNummer( int sNum );
-	void setTeam( int team );
-	void setSpielerFarbe( int farbe );
-	void setTeamFarbe( int farbe );
-	void setGeschwindigkeit( double xSpeed, double ySpeed );
-	void setPosition( double x, double y );
-	void setWendigkeit( double kurve );
-	void setSize( int radius );
-	void setKlient( Klient *klient );
-	void setLKurve( bool lK );
-	void setRKurve( bool rK );
-	void setLinienUnterbrechungsStrength( double uS );
-	void addPunkte( int p );
-	void addKill();
-	void tick( Bild *zMap, double zeit );
-	// constant
-	Klient *zKlient() const;
-	int getSpielerNummer() const;
-	int getSpielerFarbe() const;
-	int getSpielerTeam() const;
-	int getTeamFarbe() const;
-	double getX() const;
-	double getY() const;
-	double getSpeedX() const;
-	double getSpeedY() const;
-	double getKurve() const;
-	bool istAmLeben() const;
-	int getAccountId() const;
-	double getTodesZeit() const;
-	bool linieIstUnterbrochen() const;
-	int getPunkte() const;
-	bool istOnline() const;
-	int getKillFarbe() const;
-	int getRundenGewonnen() const;
-	int getLinienLength() const;
-	int getZeitAmLeben() const;
-	int getZeitTod() const;
-	int getKills() const;
-	int getTode() const;
-	int getLinienLength( int runde ) const;
-	int getKills( int runde ) const;
-	int getTodesZeit( int runde ) const;
-	bool machtKurve( bool rechts ) const;
-	// Reference Counting
-	Spieler *getThis();
-	Spieler *release();
+    // Konstruktor
+    Spieler();
+    // Destruktor
+    ~Spieler();
+    // nicht constant
+    void offline();
+    void online( SSKlientV *zKlient );
+    void neuRunde( bool amLeben );
+    void setAccountId( int id );
+    void setSpielerNummer( int sNum );
+    void setTeam( int team );
+    void setSpielerFarbe( int farbe );
+    void setTeamFarbe( int farbe );
+    void setGeschwindigkeit( double xSpeed, double ySpeed );
+    void setPosition( double x, double y );
+    void setWendigkeit( double kurve );
+    void setSize( int radius );
+    void setKlient( Klient *klient );
+    void setLKurve( bool lK );
+    void setRKurve( bool rK );
+    void setLinienUnterbrechungsStrength( double uS );
+    void addPunkte( int p );
+    void addKill();
+    void tick( Bild *zMap, double zeit );
+    // constant
+    Klient *zKlient() const;
+    int getSpielerNummer() const;
+    int getSpielerFarbe() const;
+    int getSpielerTeam() const;
+    int getTeamFarbe() const;
+    double getX() const;
+    double getY() const;
+    double getSpeedX() const;
+    double getSpeedY() const;
+    double getKurve() const;
+    bool istAmLeben() const;
+    int getAccountId() const;
+    double getTodesZeit() const;
+    bool linieIstUnterbrochen() const;
+    int getPunkte() const;
+    bool istOnline() const;
+    int getKillFarbe() const;
+    int getRundenGewonnen() const;
+    int getLinienLength() const;
+    int getZeitAmLeben() const;
+    int getZeitTod() const;
+    int getKills() const;
+    int getTode() const;
+    int getLinienLength( int runde ) const;
+    int getKills( int runde ) const;
+    int getTodesZeit( int runde ) const;
+    bool machtKurve( bool rechts ) const;
 };
 
 #endif

+ 385 - 402
Linie/Statistik.cpp

@@ -9,454 +9,437 @@
 // Inhalt der Statistik Klasse aus Statistik.h
 // Konstruktor
 Statistik::Statistik()
+    :ReferenceCounter()
 {
-	spielId = 0;
-	karteId = 0;
-	db = 0;
-	spielerAnzahl = 0;
-	spieler = new RCArray< Spieler >();
-	erstellt = 0;
-	sOnline = new Array< bool >();
-	sBereit = new Array< bool >();
-	gss = new RCArray< GesamtSpielerStatistik >();
-	gts = new RCArray< GesamtTeamStatistik >();
-	rrs = new RCArray< RundenRundenStatistik >();
-	teamNamen = 0;
-	gewinnerTeam = new Array< int >();
-	rundenDauer = new Array< int >();
-	rundenBild = new RCArray< Bild >();
-	ref = 1;
+    spielId = 0;
+    karteId = 0;
+    db = 0;
+    spielerAnzahl = 0;
+    spieler = new RCArray< Spieler >();
+    erstellt = 0;
+    sOnline = new Array< bool >();
+    sBereit = new Array< bool >();
+    gss = new RCArray< GesamtSpielerStatistik >();
+    gts = new RCArray< GesamtTeamStatistik >();
+    rrs = new RCArray< RundenRundenStatistik >();
+    teamNamen = 0;
+    gewinnerTeam = new Array< int >();
+    rundenDauer = new Array< int >();
+    rundenBild = new RCArray< Bild >();
 }
 
 // Destruktor
 Statistik::~Statistik()
 {
-	if( db )
-		db->release();
-	spieler->release();
-	sOnline->release();
-	sBereit->release();
-	gss->release();
-	gts->release();
-	rrs->release();
-	if( teamNamen )
-		teamNamen->release();
-	gewinnerTeam->release();
-	rundenDauer->release();
-	rundenBild->release();
+    if( db )
+        db->release();
+    spieler->release();
+    sOnline->release();
+    sBereit->release();
+    gss->release();
+    gts->release();
+    rrs->release();
+    if( teamNamen )
+        teamNamen->release();
+    gewinnerTeam->release();
+    rundenDauer->release();
+    rundenBild->release();
 }
 
 // privat
 void Statistik::sendeStatistik( int index )
 { // Sendet Statistik an Spieler index
-	if( !sOnline->hat( index ) || !sOnline->get( index ) )
-		return;
-	Klient *zk = spieler->z( index )->zKlient();
-	if( !zk )
-		return;
-	int anz = gss->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		zk->sendeGesamtSpielerStatistik( gss->z( i ) );
-	anz = gts->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		zk->sendeGesamtTeamStatistik( gts->z( i ) );
-	anz = rrs->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		zk->sendeRundeStatistik( rrs->z( i ) );
-	zk->sendeStatistikLadenFertig();
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( !sOnline->hat( i ) || !sOnline->get( i ) )
-			zk->sendeStatistikSpielerOffline( spieler->z( i )->getAccountId() );
-	}
+    if( !sOnline->hat( index ) || !sOnline->get( index ) )
+        return;
+    Klient *zk = spieler->z( index )->zKlient();
+    if( !zk )
+        return;
+    int anz = gss->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        zk->sendeGesamtSpielerStatistik( gss->z( i ) );
+    anz = gts->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        zk->sendeGesamtTeamStatistik( gts->z( i ) );
+    anz = rrs->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        zk->sendeRundeStatistik( rrs->z( i ) );
+    zk->sendeStatistikLadenFertig();
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( !sOnline->hat( i ) || !sOnline->get( i ) )
+            zk->sendeStatistikSpielerOffline( spieler->z( i )->getAccountId() );
+    }
 }
 
 // nicht constant
 void Statistik::setSpielId( int id )
 {
-	spielId = id;
+    spielId = id;
 }
 
 void Statistik::setKarteId( int id )
 {
-	karteId = id;
+    karteId = id;
 }
 
 void Statistik::setPSQLDB( SSDatenbankV *db )
 {
-	if( this->db )
-		this->db->release();
-	this->db = db;
+    if( this->db )
+        this->db->release();
+    this->db = db;
 }
 
 void Statistik::setTeamNamen( RCArray< Text > *namen )
 {
-	if( teamNamen )
-		teamNamen->release();
-	teamNamen = namen;
+    if( teamNamen )
+        teamNamen->release();
+    teamNamen = namen;
 }
 
 void Statistik::rundenEnde( int team, int dauer, Bild *b )
 {
-	gewinnerTeam->add( team );
-	rundenDauer->add( dauer );
-	Bild *rb = new Bild();
-	rb->neuBild( b->getBreite(), b->getHeight(), 0 );
-	rb->drawBild( 0, 0, rb->getBreite(), rb->getHeight(), *b );
-	rundenBild->add( rb );
-	b->release();
+    gewinnerTeam->add( team );
+    rundenDauer->add( dauer );
+    Bild *rb = new Bild();
+    rb->neuBild( b->getBreite(), b->getHeight(), 0 );
+    rb->drawBild( 0, 0, rb->getBreite(), rb->getHeight(), *b );
+    rundenBild->add( rb );
+    b->release();
 }
 
 void Statistik::setSpieler( int anzahl, RCArray< Spieler > *zSpieler )
 {
-	spielerAnzahl = anzahl;
-	for( int i = 0; i < anzahl; i++ )
-	{
-		spieler->set( zSpieler->get( i ), i );
-		sOnline->set( 0, i );
-		sBereit->set( 0, i );
-	}
+    spielerAnzahl = anzahl;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        spieler->set( zSpieler->get( i ), i );
+        sOnline->set( 0, i );
+        sBereit->set( 0, i );
+    }
 }
 
 void Statistik::klientOffline( int accountId )
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( spieler->z( i )->getAccountId() == accountId )
-		{
-			sOnline->set( 0, i );
-			sBereit->set( 0, i );
-		}
-		else if( sOnline->hat( i ) && sOnline->get( i ) && spieler->z( i )->zKlient() )
-			spieler->z( i )->zKlient()->sendeStatistikSpielerOffline( accountId );
-	}
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( spieler->z( i )->getAccountId() == accountId )
+        {
+            sOnline->set( 0, i );
+            sBereit->set( 0, i );
+        }
+        else if( sOnline->hat( i ) && sOnline->get( i ) && spieler->z( i )->zKlient() )
+            spieler->z( i )->zKlient()->sendeStatistikSpielerOffline( accountId );
+    }
 }
 
 void Statistik::statistikAnfrage( int accountId, short len, char *bytes )
 {
-	len--;
-	switch( *bytes )
-	{
-	case 1: // Spieler ist Bereit
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			if( !erstellt )
-			{
-				if( spieler->z( i )->getAccountId() == accountId )
-					sBereit->set( 1, i );
-			}
-			else if( spieler->z( i )->getAccountId() == accountId )
-			{
-				sendeStatistik( i );
-				break;
-			}
-		}
-		break;
-	case 2: // Chat Nachricht
-		bytes++;
-		char *txt = new char[ len + 1 ];
-		txt[ len ] = 0;
-		for( int i = 0; i < len; i++ )
-			txt[ i ] = bytes[ i ];
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			if( sOnline->hat( i ) && sOnline->get( i ) && spieler->z( i )->zKlient() )
-				spieler->z( i )->zKlient()->sendeStatistikChatNachricht( accountId, txt );
-		}
-		delete[] txt;
-		break;
-	}
+    len--;
+    switch( *bytes )
+    {
+    case 1: // Spieler ist Bereit
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            if( !erstellt )
+            {
+                if( spieler->z( i )->getAccountId() == accountId )
+                    sBereit->set( 1, i );
+            }
+            else if( spieler->z( i )->getAccountId() == accountId )
+            {
+                sendeStatistik( i );
+                break;
+            }
+        }
+        break;
+    case 2: // Chat Nachricht
+        bytes++;
+        char *txt = new char[ len + 1 ];
+        txt[ len ] = 0;
+        for( int i = 0; i < len; i++ )
+            txt[ i ] = bytes[ i ];
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            if( sOnline->hat( i ) && sOnline->get( i ) && spieler->z( i )->zKlient() )
+                spieler->z( i )->zKlient()->sendeStatistikChatNachricht( accountId, txt );
+        }
+        delete[] txt;
+        break;
+    }
 }
 
 void Statistik::run()
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-		sOnline->set( spieler->z( i )->istOnline(), i );
-	// Statistik erstellen
-	// gesammt Spieler
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( spieler->z( i ) )
-		{
-			Spieler *tmp = spieler->z( i );
-			InitDatei *d = new InitDatei();
-			Text w;
-			w = tmp->getSpielerNummer();
-			if( w.getLength() )
-				d->addWert( "SpielerNummer", w.getText() );
-			Text *sn = db->getAccountRufName( tmp->getAccountId() );
-			if( sn && sn->getLength() )
-				d->addWert( "SpielerName", sn->getText() );
-			if( sn )
-				sn->release();
-			if( teamNamen && teamNamen->z( tmp->getSpielerTeam() ) )
-				d->addWert( "TeamName", teamNamen->z( tmp->getSpielerTeam() )->getText() );
-			w = tmp->getSpielerFarbe();
-			if( w.getLength() )
-				d->addWert( "SpielerFarbe", w.getText() );
-			w = tmp->getTeamFarbe();
-			if( w.getLength() )
-				d->addWert( "TeamFarbe", w.getText() );
-			w = tmp->getRundenGewonnen();
-			if( w.getLength() )
-				d->addWert( "GewonneneRunden", w.getText() );
-			w = tmp->getPunkte();
-			if( w.getLength() )
-				d->addWert( "Punkte", w.getText() );
-			w = tmp->getLinienLength();
-			if( w.getLength() )
-				d->addWert( "LinienLänge", w.getText() );
-			w = tmp->getZeitAmLeben();
-			if( w.getLength() )
-				d->addWert( "ZeitAmLeben", w.getText() );
-			w = tmp->getZeitTod();
-			if( w.getLength() )
-				d->addWert( "ZeitTod", w.getText() );
-			w = tmp->getKills();
-			if( w.getLength() )
-				d->addWert( "Kills", w.getText() );
-			w = tmp->getTode();
-			if( w.getLength() )
-				d->addWert( "Tode", w.getText() );
-			GesamtSpielerStatistik *gss = new GesamtSpielerStatistik();
-			gss->initValues( d );
-			this->gss->add( gss );
-		}
-	}
-	// Gesamt Team
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		Spieler *tmp = spieler->z( i );
-		if( tmp )
-		{
-			int anz = gts->getEintragAnzahl();
-			bool gefunden = 0;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( gts->z( j ) && gts->z( j )->getTeamNummer() == tmp->getSpielerTeam() )
-				{
-					gefunden = 1;
-					break;
-				}
-			}
-			if( gefunden )
-				continue;
-			InitDatei *d = new InitDatei();
-			Text w;
-			w = tmp->getSpielerTeam();
-			if( w.getLength() )
-				d->addWert( "TeamNummer", w.getText() );
-			if( teamNamen && teamNamen->z( tmp->getSpielerTeam() ) )
-				d->addWert( "TeamName", teamNamen->z( tmp->getSpielerTeam() )->getText() );
-			w = tmp->getTeamFarbe();
-			if( w.getLength() )
-				d->addWert( "TeamFarbe", w.getText() );
-			int rundenGewonnen = 0;
-			anz = gewinnerTeam->getEintragAnzahl();
-			for( int j = 0; j < anz; j++ )
-			{
-				if( gewinnerTeam->hat( j ) && gewinnerTeam->get( j ) == tmp->getSpielerTeam() )
-					rundenGewonnen++;
-			}
-			w = rundenGewonnen;
-			if( w.getLength() )
-				d->addWert( "GewonneneRunden", w.getText() );
-			int punkte = 0;
-			int linienLength = 0;
-			int kills = 0;
-			int tode = 0;
-			for( int j = 0; j < spielerAnzahl; j++ )
-			{
-				Spieler *s = spieler->z( j );
-				if( s && s->getSpielerTeam() == tmp->getSpielerTeam() )
-				{
-					punkte += s->getPunkte();
-					linienLength += s->getLinienLength();
-					kills += s->getKills();
-					tode += s->getTode();
-				}
-			}
-			w = punkte;
-			if( w.getLength() )
-				d->addWert( "Punkte", w.getText() );
-			w = linienLength;
-			if( w.getLength() )
-				d->addWert( "LinienLänge", w.getText() );
-			w = kills;
-			if( w.getLength() )
-				d->addWert( "Kills", w.getText() );
-			w = tode;
-			if( w.getLength() )
-				d->addWert( "Tode", w.getText() );
-			GesamtTeamStatistik *gts = new GesamtTeamStatistik();
-			gts->initValues( d );
-			this->gts->add( gts );
-		}
-	}
-	// Rundenweise
-	int rAnz = gewinnerTeam->getEintragAnzahl();
-	for( int i = 0; i < rAnz; i++ )
-	{
-		InitDatei *d = new InitDatei();
-		Text w;
-		w = i;
-		if( w.getLength() )
-			d->addWert( "RundenNummer", w.getText() );
-		w = rundenDauer->hat( i ) ? rundenDauer->get( i ) : -1;
-		if( w.getLength() )
-			d->addWert( "RundenDauer", w.getText() );
-		w = gewinnerTeam->hat( i ) ? gewinnerTeam->get( i ) : -1;
-		if( w.getLength() )
-			d->addWert( "SiegerTeam", w.getText() );
-		int spielFeldNutzung = 0;
-		Bild *rb = rundenBild->get( i );
-		int *rbBuff = rb->getBuffer();
-		for( int j = 0; j < rb->getBreite() * rb->getHeight(); j++ )
-		{
-			if( rbBuff[ j ] )
-				spielFeldNutzung++;
-		}
-		w = (int)( ( spielFeldNutzung / ( (double)( rb->getBreite() * rb->getHeight() ) / 25 ) ) * 100 );
-		if( w.getLength() )
-			d->addWert( "SpielFeldNutzung", w.getText() );
-		RundenRundenStatistik *rrs = new RundenRundenStatistik();
-		rrs->initValues( d );
-		rrs->setBild( rb );
-		// Runde Spieler
-		for( int j = 0; j < spielerAnzahl; j++ )
-		{
-			Spieler *tmp = spieler->z( j );
-			if( tmp )
-			{
-				InitDatei *d = new InitDatei();
-				Text w;
-				w = tmp->getSpielerNummer();
-				if( w.getLength() )
-					d->addWert( "SpielerNummer", w.getText() );
-				Text *sn = db->getAccountRufName( tmp->getAccountId() );
-				if( sn && sn->getLength() )
-					d->addWert( "SpielerName", sn->getText() );
-				if( sn )
-					sn->release();
-				if( teamNamen && teamNamen->z( tmp->getSpielerTeam() ) )
-					d->addWert( "TeamName", teamNamen->z( tmp->getSpielerTeam() )->getText() );
-				w = tmp->getSpielerFarbe();
-				if( w.getLength() )
-					d->addWert( "SpielerFarbe", w.getText() );
-				w = tmp->getTeamFarbe();
-				if( w.getLength() )
-					d->addWert( "TeamFarbe", w.getText() );
-				w = tmp->getLinienLength( i );
-				if( w.getLength() )
-					d->addWert( "LinienLänge", w.getText() );
-				w = tmp->getKills( i );
-				if( w.getLength() )
-					d->addWert( "Kills", w.getText() );
-				w = tmp->getTodesZeit( i );
-				if( w.getLength() )
-					d->addWert( "Todeszeit", w.getText() );
-				RundenSpielerStatistik *rss = new RundenSpielerStatistik();
-				rss->initValues( d );
-				rrs->addSpielerStatistik( rss );
-			}
-		}
-		// Runde Team
-		for( int j = 0; j < spielerAnzahl; j++ )
-		{
-			Spieler *tmp = spieler->z( j );
-			if( tmp )
-			{
-				int anz = gts->getEintragAnzahl();
-				bool gefunden = 0;
-				for( int k = 0; k < anz; k++ )
-				{
-					if( rrs->zTeamStatistik( k ) && rrs->zTeamStatistik( k )->getTeamNummer() == tmp->getSpielerTeam() )
-					{
-						gefunden = 1;
-						break;
-					}
-				}
-				if( gefunden )
-					continue;
-				InitDatei *d = new InitDatei();
-				Text w;
-				w = tmp->getSpielerTeam();
-				if( w.getLength() )
-					d->addWert( "TeamNummer", w.getText() );
-				if( teamNamen && teamNamen->z( tmp->getSpielerTeam() ) )
-					d->addWert( "TeamName", teamNamen->z( tmp->getSpielerTeam() )->getText() );
-				w = tmp->getTeamFarbe();
-				if( w.getLength() )
-					d->addWert( "TeamFarbe", w.getText() );
-				w = (int)( ( gewinnerTeam->hat( i ) ? gewinnerTeam->get( i ) : 0 ) == tmp->getSpielerTeam() );
-				if( w.getLength() )
-					d->addWert( "Ergebnis", w.getText() );
-				int linienLength = 0;
-				int kills = 0;
-				int tode = 0;
-				for( int k = 0; k < spielerAnzahl; k++ )
-				{
-					Spieler *s = spieler->z( k );
-					if( s && s->getSpielerTeam() == tmp->getSpielerTeam() )
-					{
-						linienLength += s->getLinienLength( i );
-						kills += s->getKills( i );
-						tode += ( s->getTodesZeit( i ) != 0 );
-					}
-				}
-				w = linienLength;
-				if( w.getLength() )
-					d->addWert( "LinienLänge", w.getText() );
-				w = kills;
-				if( w.getLength() )
-					d->addWert( "Kills", w.getText() );
-				w = tode;
-				if( w.getLength() )
-					d->addWert( "Tode", w.getText() );
-				RundenTeamStatistik *rts = new RundenTeamStatistik();
-				rts->initValues( d );
-				rrs->addTeamStatistik( rts );
-			}
-		}
-		this->rrs->add( rrs );
-	}
-	erstellt = 1;
-	// Statistik senden
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( sBereit->hat( i ) && sBereit->get( i ) )
-			sendeStatistik( i );
-	}
-	// Statistik speichern
-	Text *pfad = new Text( "../spiel log/" );
-	pfad->append( spielId );
-	pfad->append( "/fertig" );
-	DateiPfadErstellen( pfad );
-	// warten bis alle verlassen haben
-	while( 1 )
-	{
-		Sleep( 1000 );
-		int online = 0;
-		for( int i = 0; i < spielerAnzahl; i++ )
-			online += sOnline->hat( i ) && sOnline->get( i );
-		if( !online )
-			break;
-	}
-}
-
-// constant
-
-// Reference Counting
-StatistikV *Statistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-StatistikV *Statistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    for( int i = 0; i < spielerAnzahl; i++ )
+        sOnline->set( spieler->z( i )->istOnline(), i );
+    // Statistik erstellen
+    // gesammt Spieler
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( spieler->z( i ) )
+        {
+            Spieler *tmp = spieler->z( i );
+            InitDatei *d = new InitDatei();
+            Text w;
+            w = tmp->getSpielerNummer();
+            if( w.getLength() )
+                d->addWert( "SpielerNummer", w.getText() );
+            Text *sn = db->getAccountRufName( tmp->getAccountId() );
+            if( sn && sn->getLength() )
+                d->addWert( "SpielerName", sn->getText() );
+            if( sn )
+                sn->release();
+            if( teamNamen && teamNamen->z( tmp->getSpielerTeam() ) )
+                d->addWert( "TeamName", teamNamen->z( tmp->getSpielerTeam() )->getText() );
+            w = tmp->getSpielerFarbe();
+            if( w.getLength() )
+                d->addWert( "SpielerFarbe", w.getText() );
+            w = tmp->getTeamFarbe();
+            if( w.getLength() )
+                d->addWert( "TeamFarbe", w.getText() );
+            w = tmp->getRundenGewonnen();
+            if( w.getLength() )
+                d->addWert( "GewonneneRunden", w.getText() );
+            w = tmp->getPunkte();
+            if( w.getLength() )
+                d->addWert( "Punkte", w.getText() );
+            w = tmp->getLinienLength();
+            if( w.getLength() )
+                d->addWert( "LinienLänge", w.getText() );
+            w = tmp->getZeitAmLeben();
+            if( w.getLength() )
+                d->addWert( "ZeitAmLeben", w.getText() );
+            w = tmp->getZeitTod();
+            if( w.getLength() )
+                d->addWert( "ZeitTod", w.getText() );
+            w = tmp->getKills();
+            if( w.getLength() )
+                d->addWert( "Kills", w.getText() );
+            w = tmp->getTode();
+            if( w.getLength() )
+                d->addWert( "Tode", w.getText() );
+            GesamtSpielerStatistik *gss = new GesamtSpielerStatistik();
+            gss->initValues( d );
+            this->gss->add( gss );
+        }
+    }
+    // Gesamt Team
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        Spieler *tmp = spieler->z( i );
+        if( tmp )
+        {
+            int anz = gts->getEintragAnzahl();
+            bool gefunden = 0;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( gts->z( j ) && gts->z( j )->getTeamNummer() == tmp->getSpielerTeam() )
+                {
+                    gefunden = 1;
+                    break;
+                }
+            }
+            if( gefunden )
+                continue;
+            InitDatei *d = new InitDatei();
+            Text w;
+            w = tmp->getSpielerTeam();
+            if( w.getLength() )
+                d->addWert( "TeamNummer", w.getText() );
+            if( teamNamen && teamNamen->z( tmp->getSpielerTeam() ) )
+                d->addWert( "TeamName", teamNamen->z( tmp->getSpielerTeam() )->getText() );
+            w = tmp->getTeamFarbe();
+            if( w.getLength() )
+                d->addWert( "TeamFarbe", w.getText() );
+            int rundenGewonnen = 0;
+            anz = gewinnerTeam->getEintragAnzahl();
+            for( int j = 0; j < anz; j++ )
+            {
+                if( gewinnerTeam->hat( j ) && gewinnerTeam->get( j ) == tmp->getSpielerTeam() )
+                    rundenGewonnen++;
+            }
+            w = rundenGewonnen;
+            if( w.getLength() )
+                d->addWert( "GewonneneRunden", w.getText() );
+            int punkte = 0;
+            int linienLength = 0;
+            int kills = 0;
+            int tode = 0;
+            for( int j = 0; j < spielerAnzahl; j++ )
+            {
+                Spieler *s = spieler->z( j );
+                if( s && s->getSpielerTeam() == tmp->getSpielerTeam() )
+                {
+                    punkte += s->getPunkte();
+                    linienLength += s->getLinienLength();
+                    kills += s->getKills();
+                    tode += s->getTode();
+                }
+            }
+            w = punkte;
+            if( w.getLength() )
+                d->addWert( "Punkte", w.getText() );
+            w = linienLength;
+            if( w.getLength() )
+                d->addWert( "LinienLänge", w.getText() );
+            w = kills;
+            if( w.getLength() )
+                d->addWert( "Kills", w.getText() );
+            w = tode;
+            if( w.getLength() )
+                d->addWert( "Tode", w.getText() );
+            GesamtTeamStatistik *gts = new GesamtTeamStatistik();
+            gts->initValues( d );
+            this->gts->add( gts );
+        }
+    }
+    // Rundenweise
+    int rAnz = gewinnerTeam->getEintragAnzahl();
+    for( int i = 0; i < rAnz; i++ )
+    {
+        InitDatei *d = new InitDatei();
+        Text w;
+        w = i;
+        if( w.getLength() )
+            d->addWert( "RundenNummer", w.getText() );
+        w = rundenDauer->hat( i ) ? rundenDauer->get( i ) : -1;
+        if( w.getLength() )
+            d->addWert( "RundenDauer", w.getText() );
+        w = gewinnerTeam->hat( i ) ? gewinnerTeam->get( i ) : -1;
+        if( w.getLength() )
+            d->addWert( "SiegerTeam", w.getText() );
+        int spielFeldNutzung = 0;
+        Bild *rb = rundenBild->get( i );
+        int *rbBuff = rb->getBuffer();
+        for( int j = 0; j < rb->getBreite() * rb->getHeight(); j++ )
+        {
+            if( rbBuff[ j ] )
+                spielFeldNutzung++;
+        }
+        w = (int)( ( spielFeldNutzung / ( (double)( rb->getBreite() * rb->getHeight() ) / 25 ) ) * 100 );
+        if( w.getLength() )
+            d->addWert( "SpielFeldNutzung", w.getText() );
+        RundenRundenStatistik *rrs = new RundenRundenStatistik();
+        rrs->initValues( d );
+        rrs->setBild( rb );
+        // Runde Spieler
+        for( int j = 0; j < spielerAnzahl; j++ )
+        {
+            Spieler *tmp = spieler->z( j );
+            if( tmp )
+            {
+                InitDatei *d = new InitDatei();
+                Text w;
+                w = tmp->getSpielerNummer();
+                if( w.getLength() )
+                    d->addWert( "SpielerNummer", w.getText() );
+                Text *sn = db->getAccountRufName( tmp->getAccountId() );
+                if( sn && sn->getLength() )
+                    d->addWert( "SpielerName", sn->getText() );
+                if( sn )
+                    sn->release();
+                if( teamNamen && teamNamen->z( tmp->getSpielerTeam() ) )
+                    d->addWert( "TeamName", teamNamen->z( tmp->getSpielerTeam() )->getText() );
+                w = tmp->getSpielerFarbe();
+                if( w.getLength() )
+                    d->addWert( "SpielerFarbe", w.getText() );
+                w = tmp->getTeamFarbe();
+                if( w.getLength() )
+                    d->addWert( "TeamFarbe", w.getText() );
+                w = tmp->getLinienLength( i );
+                if( w.getLength() )
+                    d->addWert( "LinienLänge", w.getText() );
+                w = tmp->getKills( i );
+                if( w.getLength() )
+                    d->addWert( "Kills", w.getText() );
+                w = tmp->getTodesZeit( i );
+                if( w.getLength() )
+                    d->addWert( "Todeszeit", w.getText() );
+                RundenSpielerStatistik *rss = new RundenSpielerStatistik();
+                rss->initValues( d );
+                rrs->addSpielerStatistik( rss );
+            }
+        }
+        // Runde Team
+        for( int j = 0; j < spielerAnzahl; j++ )
+        {
+            Spieler *tmp = spieler->z( j );
+            if( tmp )
+            {
+                int anz = gts->getEintragAnzahl();
+                bool gefunden = 0;
+                for( int k = 0; k < anz; k++ )
+                {
+                    if( rrs->zTeamStatistik( k ) && rrs->zTeamStatistik( k )->getTeamNummer() == tmp->getSpielerTeam() )
+                    {
+                        gefunden = 1;
+                        break;
+                    }
+                }
+                if( gefunden )
+                    continue;
+                InitDatei *d = new InitDatei();
+                Text w;
+                w = tmp->getSpielerTeam();
+                if( w.getLength() )
+                    d->addWert( "TeamNummer", w.getText() );
+                if( teamNamen && teamNamen->z( tmp->getSpielerTeam() ) )
+                    d->addWert( "TeamName", teamNamen->z( tmp->getSpielerTeam() )->getText() );
+                w = tmp->getTeamFarbe();
+                if( w.getLength() )
+                    d->addWert( "TeamFarbe", w.getText() );
+                w = (int)( ( gewinnerTeam->hat( i ) ? gewinnerTeam->get( i ) : 0 ) == tmp->getSpielerTeam() );
+                if( w.getLength() )
+                    d->addWert( "Ergebnis", w.getText() );
+                int linienLength = 0;
+                int kills = 0;
+                int tode = 0;
+                for( int k = 0; k < spielerAnzahl; k++ )
+                {
+                    Spieler *s = spieler->z( k );
+                    if( s && s->getSpielerTeam() == tmp->getSpielerTeam() )
+                    {
+                        linienLength += s->getLinienLength( i );
+                        kills += s->getKills( i );
+                        tode += ( s->getTodesZeit( i ) != 0 );
+                    }
+                }
+                w = linienLength;
+                if( w.getLength() )
+                    d->addWert( "LinienLänge", w.getText() );
+                w = kills;
+                if( w.getLength() )
+                    d->addWert( "Kills", w.getText() );
+                w = tode;
+                if( w.getLength() )
+                    d->addWert( "Tode", w.getText() );
+                RundenTeamStatistik *rts = new RundenTeamStatistik();
+                rts->initValues( d );
+                rrs->addTeamStatistik( rts );
+            }
+        }
+        this->rrs->add( rrs );
+    }
+    erstellt = 1;
+    // Statistik senden
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( sBereit->hat( i ) && sBereit->get( i ) )
+            sendeStatistik( i );
+    }
+    // Statistik speichern
+    Text *pfad = new Text( "../spiel log/" );
+    pfad->append( spielId );
+    pfad->append( "/fertig" );
+    DateiPfadErstellen( pfad );
+    // warten bis alle verlassen haben
+    while( 1 )
+    {
+        Sleep( 1000 );
+        int online = 0;
+        for( int i = 0; i < spielerAnzahl; i++ )
+            online += sOnline->hat( i ) && sOnline->get( i );
+        if( !online )
+            break;
+    }
 }

+ 30 - 36
Linie/Statistik.h

@@ -11,45 +11,39 @@
 class Statistik : public StatistikV
 {
 private:
-	int spielId;
-	int karteId;
-	SSDatenbankV *db;
-	int spielerAnzahl;
-	RCArray< Spieler > *spieler;
-	bool erstellt;
-	Array< bool > *sOnline;
-	Array< bool > *sBereit;
-	RCArray< GesamtSpielerStatistik > *gss;
-	RCArray< GesamtTeamStatistik > *gts;
-	RCArray< RundenRundenStatistik > *rrs;
-	RCArray< Text > *teamNamen;
-	Array< int > *gewinnerTeam;
-	Array< int > *rundenDauer;
-	RCArray< Bild > *rundenBild;
-	int ref;
+    int spielId;
+    int karteId;
+    SSDatenbankV *db;
+    int spielerAnzahl;
+    RCArray< Spieler > *spieler;
+    bool erstellt;
+    Array< bool > *sOnline;
+    Array< bool > *sBereit;
+    RCArray< GesamtSpielerStatistik > *gss;
+    RCArray< GesamtTeamStatistik > *gts;
+    RCArray< RundenRundenStatistik > *rrs;
+    RCArray< Text > *teamNamen;
+    Array< int > *gewinnerTeam;
+    Array< int > *rundenDauer;
+    RCArray< Bild > *rundenBild;
 
-	void sendeStatistik( int index );
+    void sendeStatistik( int index );
 
 public:
-	// Konstruktor
-	Statistik();
-	// Destruktor
-	~Statistik();
-	// nicht constant
-	void setSpielId( int id );
-	void setKarteId( int id );
-	void setPSQLDB( SSDatenbankV *db );
-	void setTeamNamen( RCArray< Text > *namen );
-	void rundenEnde( int team, int dauer, Bild *b );
-	void setSpieler( int anzahl, RCArray< Spieler > *zSpieler );
-	virtual void klientOffline( int accountId );
-	virtual void statistikAnfrage( int accountId, short len, char *bytes );
-	virtual void run();
-	// constant
-
-	// Reference Counting
-	virtual StatistikV *getThis();
-	virtual StatistikV *release();
+    // Konstruktor
+    Statistik();
+    // Destruktor
+    ~Statistik();
+    // nicht constant
+    void setSpielId( int id );
+    void setKarteId( int id );
+    void setPSQLDB( SSDatenbankV *db );
+    void setTeamNamen( RCArray< Text > *namen );
+    void rundenEnde( int team, int dauer, Bild *b );
+    void setSpieler( int anzahl, RCArray< Spieler > *zSpieler );
+    virtual void klientOffline( int accountId );
+    virtual void statistikAnfrage( int accountId, short len, char *bytes );
+    virtual void run();
 };
 
 #endif

+ 9 - 13
Linie/StatistikKlasse.h

@@ -1,23 +1,19 @@
 #ifndef StatistikKlasse_H
 #define StatistikKlasse_H
 
-class StatistikV
+#include <ReferenceCounter.h>
+
+class StatistikV : public virtual Framework::ReferenceCounter
 {
 private:
 
 public:
-	virtual ~StatistikV()
-	{
-	}
-	// nicht constant
-	virtual void klientOffline( int accountId ) = 0;
-	virtual void statistikAnfrage( int accountId, short len, char *bytes ) = 0;
-	virtual void run() = 0;
-	// constant
-
-	// Reference Counting
-	virtual StatistikV *getThis() = 0;
-	virtual StatistikV *release() = 0;
+    virtual ~StatistikV()
+    {}
+    // nicht constant
+    virtual void klientOffline( int accountId ) = 0;
+    virtual void statistikAnfrage( int accountId, short len, char *bytes ) = 0;
+    virtual void run() = 0;
 };
 
 #endif

+ 11 - 11
Linie/Strukturen.h

@@ -8,17 +8,17 @@ using namespace Framework;
 
 struct SpielerTeamStruktur
 {
-	SpielerTeamStruktur();
-	~SpielerTeamStruktur();
-	int spielerAnzahl;
-	int teamAnzahl;
-	Array< int > *spielerFarbe;
-	Array< int > *teamFarbe;
-	RCArray< Text > *teamName;
-	Array< int > *teamSize;
-	int ref;
-	SpielerTeamStruktur *getThis();
-	SpielerTeamStruktur *release();
+    SpielerTeamStruktur();
+    ~SpielerTeamStruktur();
+    int spielerAnzahl;
+    int teamAnzahl;
+    Array< int > *spielerFarbe;
+    Array< int > *teamFarbe;
+    RCArray< Text > *teamName;
+    Array< int > *teamSize;
+    int ref;
+    SpielerTeamStruktur *getThis();
+    SpielerTeamStruktur *release();
 };
 
 #endif