浏览代码

use framework reference counter

Kolja Strohm 3 年之前
父节点
当前提交
d03936bd71

+ 4 - 2
Asteroids Linux/Asteroids Linux.vcxproj

@@ -40,7 +40,7 @@
     <TargetName>Asteroids</TargetName>
     <TargetExt>.so</TargetExt>
     <RemoteProjectDir>$(RemoteRootDir)/Spiele/Asteroids/debug</RemoteProjectDir>
-    <IncludePath>..\..\..\..\..\Allgemein\Framework;../../../Framework/debug;..\..\..\..\..\Allgemein\Network\Network;../../../Network/debug;..\Asteroids;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;../../../../Framework/debug;..\..\..\..\..\Allgemein\Network\Network;../../../../Network/debug/Network;..\Asteroids;$(IncludePath)</IncludePath>
     <OutDir>$(RemoteRootDir)/Spiele/Asteroids/debug/</OutDir>
     <IntDir>$(RemoteRootDir)/Spiele/Asteroids/debug/</IntDir>
     <RemoteTargetPath>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</RemoteTargetPath>
@@ -49,7 +49,7 @@
     <TargetName>Asteroids</TargetName>
     <TargetExt>.so</TargetExt>
     <RemoteProjectDir>$(RemoteRootDir)/Spiele/Asteroids/release</RemoteProjectDir>
-    <IncludePath>..\..\..\..\..\Allgemein\Framework;../../../Framework/debug;..\..\..\..\..\Allgemein\Network\Network;../../../Network/debug;..\Asteroids;$(IncludePath);$(ISenseIncludePath)</IncludePath>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;../../../../Framework/debug;..\..\..\..\..\Allgemein\Network\Network;../../../../Network/debug/Network;..\Asteroids;$(IncludePath);$(ISenseIncludePath)</IncludePath>
     <OutDir>$(RemoteRootDir)/Spiele/Asteroids/release/</OutDir>
     <IntDir>$(RemoteRootDir)/Spiele/Asteroids/release/</IntDir>
     <RemoteTargetPath>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</RemoteTargetPath>
@@ -102,6 +102,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Link>
       <UnresolvedSymbolReferences>false</UnresolvedSymbolReferences>
+      <OutputFile>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</OutputFile>
     </Link>
     <ClCompile>
       <AdditionalOptions>-fPIC %(AdditionalOptions)</AdditionalOptions>
@@ -110,6 +111,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Link>
       <UnresolvedSymbolReferences>false</UnresolvedSymbolReferences>
+      <OutputFile>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</OutputFile>
     </Link>
     <ClCompile>
       <AdditionalOptions>-fPIC %(AdditionalOptions)</AdditionalOptions>

二进制
Asteroids Linux/Asteroids.so


+ 1 - 4
Asteroids/ESEditorV.h

@@ -6,7 +6,7 @@
 using namespace Framework;
 using namespace Network;
 
-class ESEditorV
+class ESEditorV : public virtual ReferenceCounter
 {
 private:
 
@@ -19,7 +19,4 @@ public:
     virtual bool nachricht( SKlient *k ) = 0;
     // constant
     virtual char *getLetzterFehler() const = 0;
-    // Reference Counting 
-    virtual ESEditorV *getThis() = 0;
-    virtual ESEditorV *release() = 0;
 };

+ 131 - 147
Asteroids/Editor.cpp

@@ -7,9 +7,8 @@
 // Inhalt der Editor Klasse aus Editor.h
 // Konstruktor
 Editor::Editor()
-{
-    ref = 1;
-}
+    : ReferenceCounter()
+{}
 
 // Destruktor
 Editor::~Editor()
@@ -69,7 +68,7 @@ bool Editor::nachricht( SKlient *k )
         {
             k->sendeEncrypted( "\1", 1 );
             int anz = files->getEintragAnzahl();
-            k->sendeEncrypted( (char *)& anz, 4 );
+            k->sendeEncrypted( (char *)&anz, 4 );
             for( int i = 0; i < anz; i++ )
             {
                 Text pf = tmpPf;
@@ -78,28 +77,28 @@ bool Editor::nachricht( SKlient *k )
                 Datei player;
                 player.setDatei( pf );
                 player.open( Datei::Style::lesen );
-                SpielerStr p( player.getThis() );
+                SpielerStr p( dynamic_cast<Datei *>( player.getThis() ) );
                 player.close();
-                k->sendeEncrypted( (char *)& p.id, 4 );
-                k->sendeEncrypted( (char *)& p.pos.x, 4 );
-                k->sendeEncrypted( (char *)& p.pos.y, 4 );
-                k->sendeEncrypted( (char *)& p.rot, 8 );
-                k->sendeEncrypted( (char *)& p.beschleunigung, 8 );
-                k->sendeEncrypted( (char *)& p.maxStability, 4 );
-                k->sendeEncrypted( (char *)& p.maxEnergie, 4 );
-                k->sendeEncrypted( (char *)& p.reparatur, 8 );
-                k->sendeEncrypted( (char *)& p.akkuLeistung, 8 );
-                k->sendeEncrypted( (char *)& p.laserIntensity, 4 );
-                k->sendeEncrypted( (char *)& p.laserEffizienz, 4 );
-                k->sendeEncrypted( (char *)& p.laserTempo, 4 );
-                k->sendeEncrypted( (char *)& p.wendigkeit, 8 );
-                k->sendeEncrypted( (char *)& p.antriebEffizienz, 8 );
-                k->sendeEncrypted( (char *)& p.energieSchild, 8 );
-                k->sendeEncrypted( (char *)& p.energieSchildEffizienz, 8 );
-                k->sendeEncrypted( (char *)& p.netzwerk, 4 );
-                k->sendeEncrypted( (char *)& p.skillPunkte, 4 );
-                k->sendeEncrypted( (char *)& p.m2d, 4 );
-                k->sendeEncrypted( (char *)& p.bild, 4 );
+                k->sendeEncrypted( (char *)&p.id, 4 );
+                k->sendeEncrypted( (char *)&p.pos.x, 4 );
+                k->sendeEncrypted( (char *)&p.pos.y, 4 );
+                k->sendeEncrypted( (char *)&p.rot, 8 );
+                k->sendeEncrypted( (char *)&p.beschleunigung, 8 );
+                k->sendeEncrypted( (char *)&p.maxStability, 4 );
+                k->sendeEncrypted( (char *)&p.maxEnergie, 4 );
+                k->sendeEncrypted( (char *)&p.reparatur, 8 );
+                k->sendeEncrypted( (char *)&p.akkuLeistung, 8 );
+                k->sendeEncrypted( (char *)&p.laserIntensity, 4 );
+                k->sendeEncrypted( (char *)&p.laserEffizienz, 4 );
+                k->sendeEncrypted( (char *)&p.laserTempo, 4 );
+                k->sendeEncrypted( (char *)&p.wendigkeit, 8 );
+                k->sendeEncrypted( (char *)&p.antriebEffizienz, 8 );
+                k->sendeEncrypted( (char *)&p.energieSchild, 8 );
+                k->sendeEncrypted( (char *)&p.energieSchildEffizienz, 8 );
+                k->sendeEncrypted( (char *)&p.netzwerk, 4 );
+                k->sendeEncrypted( (char *)&p.skillPunkte, 4 );
+                k->sendeEncrypted( (char *)&p.m2d, 4 );
+                k->sendeEncrypted( (char *)&p.bild, 4 );
             }
         }
         else
@@ -121,7 +120,7 @@ bool Editor::nachricht( SKlient *k )
         {
             k->sendeEncrypted( "\1", 1 );
             int anz = files->getEintragAnzahl();
-            k->sendeEncrypted( (char *)& anz, 4 );
+            k->sendeEncrypted( (char *)&anz, 4 );
             for( int i = 0; i < anz; i++ )
             {
                 Text pf = tmpPf;
@@ -130,23 +129,23 @@ bool Editor::nachricht( SKlient *k )
                 Datei team;
                 team.setDatei( pf );
                 team.open( Datei::Style::lesen );
-                TeamStr t( team.getThis() );
+                TeamStr t( dynamic_cast<Datei *>( team.getThis() ) );
                 team.close();
-                k->sendeEncrypted( (char *)& t.id, 4 );
-                k->sendeEncrypted( (char *)& t.maxPunkte, 4 );
-                k->sendeEncrypted( (char *)& t.beschleunigung, 8 );
-                k->sendeEncrypted( (char *)& t.maxStability, 4 );
-                k->sendeEncrypted( (char *)& t.maxEnergie, 4 );
-                k->sendeEncrypted( (char *)& t.reparatur, 8 );
-                k->sendeEncrypted( (char *)& t.akkuLeistung, 8 );
-                k->sendeEncrypted( (char *)& t.laserIntensity, 4 );
-                k->sendeEncrypted( (char *)& t.laserEffizienz, 4 );
-                k->sendeEncrypted( (char *)& t.laserTempo, 4 );
-                k->sendeEncrypted( (char *)& t.wendigkeit, 8 );
-                k->sendeEncrypted( (char *)& t.antriebEffizienz, 8 );
-                k->sendeEncrypted( (char *)& t.energieSchild, 8 );
-                k->sendeEncrypted( (char *)& t.energieSchildEffizienz, 8 );
-                k->sendeEncrypted( (char *)& t.punkte, 4 );
+                k->sendeEncrypted( (char *)&t.id, 4 );
+                k->sendeEncrypted( (char *)&t.maxPunkte, 4 );
+                k->sendeEncrypted( (char *)&t.beschleunigung, 8 );
+                k->sendeEncrypted( (char *)&t.maxStability, 4 );
+                k->sendeEncrypted( (char *)&t.maxEnergie, 4 );
+                k->sendeEncrypted( (char *)&t.reparatur, 8 );
+                k->sendeEncrypted( (char *)&t.akkuLeistung, 8 );
+                k->sendeEncrypted( (char *)&t.laserIntensity, 4 );
+                k->sendeEncrypted( (char *)&t.laserEffizienz, 4 );
+                k->sendeEncrypted( (char *)&t.laserTempo, 4 );
+                k->sendeEncrypted( (char *)&t.wendigkeit, 8 );
+                k->sendeEncrypted( (char *)&t.antriebEffizienz, 8 );
+                k->sendeEncrypted( (char *)&t.energieSchild, 8 );
+                k->sendeEncrypted( (char *)&t.energieSchildEffizienz, 8 );
+                k->sendeEncrypted( (char *)&t.punkte, 4 );
             }
         }
         else
@@ -168,7 +167,7 @@ bool Editor::nachricht( SKlient *k )
         {
             k->sendeEncrypted( "\1", 1 );
             int anz = files->getEintragAnzahl();
-            k->sendeEncrypted( (char *)& anz, 4 );
+            k->sendeEncrypted( (char *)&anz, 4 );
             for( int i = 0; i < anz; i++ )
             {
                 Text pf = tmpPf;
@@ -177,22 +176,22 @@ bool Editor::nachricht( SKlient *k )
                 Datei object;
                 object.setDatei( pf );
                 object.open( Datei::Style::lesen );
-                ObjektStr o( object.getThis() );
+                ObjektStr o( dynamic_cast<Datei *>( object.getThis() ) );
                 object.close();
-                k->sendeEncrypted( (char *)& o.pos.x, 4 );
-                k->sendeEncrypted( (char *)& o.pos.y, 4 );
-                k->sendeEncrypted( (char *)& o.rot, 4 );
-                k->sendeEncrypted( (char *)& o.scale, 4 );
-                k->sendeEncrypted( (char *)& o.id, 4 );
-                k->sendeEncrypted( (char *)& o.m2d, 4 );
-                k->sendeEncrypted( (char *)& o.bild, 4 );
-                k->sendeEncrypted( (char *)& o.style, 4 );
-                k->sendeEncrypted( (char *)& o.maxStability, 4 );
-                k->sendeEncrypted( (char *)& o.maxEnergie, 4 );
-                k->sendeEncrypted( (char *)& o.energieRadius, 4 );
-                k->sendeEncrypted( (char *)& o.reparatur, 8 );
-                k->sendeEncrypted( (char *)& o.akkuLeistung, 8 );
-                k->sendeEncrypted( (char *)& o.team, 1 );
+                k->sendeEncrypted( (char *)&o.pos.x, 4 );
+                k->sendeEncrypted( (char *)&o.pos.y, 4 );
+                k->sendeEncrypted( (char *)&o.rot, 4 );
+                k->sendeEncrypted( (char *)&o.scale, 4 );
+                k->sendeEncrypted( (char *)&o.id, 4 );
+                k->sendeEncrypted( (char *)&o.m2d, 4 );
+                k->sendeEncrypted( (char *)&o.bild, 4 );
+                k->sendeEncrypted( (char *)&o.style, 4 );
+                k->sendeEncrypted( (char *)&o.maxStability, 4 );
+                k->sendeEncrypted( (char *)&o.maxEnergie, 4 );
+                k->sendeEncrypted( (char *)&o.energieRadius, 4 );
+                k->sendeEncrypted( (char *)&o.reparatur, 8 );
+                k->sendeEncrypted( (char *)&o.akkuLeistung, 8 );
+                k->sendeEncrypted( (char *)&o.team, 1 );
             }
         }
         else
@@ -207,26 +206,26 @@ bool Editor::nachricht( SKlient *k )
     {
         k->sendeEncrypted( "\1", 1 );
         SpielerStr p( 0 );
-        k->getNachrichtEncrypted( (char *)& p.id, 4 );
-        k->getNachrichtEncrypted( (char *)& p.pos.x, 4 );
-        k->getNachrichtEncrypted( (char *)& p.pos.y, 4 );
-        k->getNachrichtEncrypted( (char *)& p.rot, 8 );
-        k->getNachrichtEncrypted( (char *)& p.beschleunigung, 8 );
-        k->getNachrichtEncrypted( (char *)& p.maxStability, 4 );
-        k->getNachrichtEncrypted( (char *)& p.maxEnergie, 4 );
-        k->getNachrichtEncrypted( (char *)& p.reparatur, 8 );
-        k->getNachrichtEncrypted( (char *)& p.akkuLeistung, 8 );
-        k->getNachrichtEncrypted( (char *)& p.laserIntensity, 4 );
-        k->getNachrichtEncrypted( (char *)& p.laserEffizienz, 4 );
-        k->getNachrichtEncrypted( (char *)& p.laserTempo, 4 );
-        k->getNachrichtEncrypted( (char *)& p.wendigkeit, 8 );
-        k->getNachrichtEncrypted( (char *)& p.antriebEffizienz, 8 );
-        k->getNachrichtEncrypted( (char *)& p.energieSchild, 8 );
-        k->getNachrichtEncrypted( (char *)& p.energieSchildEffizienz, 8 );
-        k->getNachrichtEncrypted( (char *)& p.netzwerk, 4 );
-        k->getNachrichtEncrypted( (char *)& p.skillPunkte, 4 );
-        k->getNachrichtEncrypted( (char *)& p.m2d, 4 );
-        k->getNachrichtEncrypted( (char *)& p.bild, 4 );
+        k->getNachrichtEncrypted( (char *)&p.id, 4 );
+        k->getNachrichtEncrypted( (char *)&p.pos.x, 4 );
+        k->getNachrichtEncrypted( (char *)&p.pos.y, 4 );
+        k->getNachrichtEncrypted( (char *)&p.rot, 8 );
+        k->getNachrichtEncrypted( (char *)&p.beschleunigung, 8 );
+        k->getNachrichtEncrypted( (char *)&p.maxStability, 4 );
+        k->getNachrichtEncrypted( (char *)&p.maxEnergie, 4 );
+        k->getNachrichtEncrypted( (char *)&p.reparatur, 8 );
+        k->getNachrichtEncrypted( (char *)&p.akkuLeistung, 8 );
+        k->getNachrichtEncrypted( (char *)&p.laserIntensity, 4 );
+        k->getNachrichtEncrypted( (char *)&p.laserEffizienz, 4 );
+        k->getNachrichtEncrypted( (char *)&p.laserTempo, 4 );
+        k->getNachrichtEncrypted( (char *)&p.wendigkeit, 8 );
+        k->getNachrichtEncrypted( (char *)&p.antriebEffizienz, 8 );
+        k->getNachrichtEncrypted( (char *)&p.energieSchild, 8 );
+        k->getNachrichtEncrypted( (char *)&p.energieSchildEffizienz, 8 );
+        k->getNachrichtEncrypted( (char *)&p.netzwerk, 4 );
+        k->getNachrichtEncrypted( (char *)&p.skillPunkte, 4 );
+        k->getNachrichtEncrypted( (char *)&p.m2d, 4 );
+        k->getNachrichtEncrypted( (char *)&p.bild, 4 );
         Text pf = pfad.getText();
         pf += "/player/";
         pf += p.id;
@@ -235,7 +234,7 @@ bool Editor::nachricht( SKlient *k )
         player.setDatei( pf );
         if( player.open( Datei::Style::schreiben ) )
         {
-            p.save( player.getThis() );
+            p.save( dynamic_cast<Datei *>( player.getThis() ) );
             player.close();
             k->sendeEncrypted( "\1", 1 );
             return 1;
@@ -248,21 +247,21 @@ bool Editor::nachricht( SKlient *k )
     {
         k->sendeEncrypted( "\1", 1 );
         TeamStr t( 0 );
-        k->getNachrichtEncrypted( (char *)& t.id, 4 );
-        k->getNachrichtEncrypted( (char *)& t.maxPunkte, 4 );
-        k->getNachrichtEncrypted( (char *)& t.beschleunigung, 8 );
-        k->getNachrichtEncrypted( (char *)& t.maxStability, 4 );
-        k->getNachrichtEncrypted( (char *)& t.maxEnergie, 4 );
-        k->getNachrichtEncrypted( (char *)& t.reparatur, 8 );
-        k->getNachrichtEncrypted( (char *)& t.akkuLeistung, 8 );
-        k->getNachrichtEncrypted( (char *)& t.laserIntensity, 4 );
-        k->getNachrichtEncrypted( (char *)& t.laserEffizienz, 4 );
-        k->getNachrichtEncrypted( (char *)& t.laserTempo, 4 );
-        k->getNachrichtEncrypted( (char *)& t.wendigkeit, 8 );
-        k->getNachrichtEncrypted( (char *)& t.antriebEffizienz, 8 );
-        k->getNachrichtEncrypted( (char *)& t.energieSchild, 8 );
-        k->getNachrichtEncrypted( (char *)& t.energieSchildEffizienz, 8 );
-        k->getNachrichtEncrypted( (char *)& t.punkte, 4 );
+        k->getNachrichtEncrypted( (char *)&t.id, 4 );
+        k->getNachrichtEncrypted( (char *)&t.maxPunkte, 4 );
+        k->getNachrichtEncrypted( (char *)&t.beschleunigung, 8 );
+        k->getNachrichtEncrypted( (char *)&t.maxStability, 4 );
+        k->getNachrichtEncrypted( (char *)&t.maxEnergie, 4 );
+        k->getNachrichtEncrypted( (char *)&t.reparatur, 8 );
+        k->getNachrichtEncrypted( (char *)&t.akkuLeistung, 8 );
+        k->getNachrichtEncrypted( (char *)&t.laserIntensity, 4 );
+        k->getNachrichtEncrypted( (char *)&t.laserEffizienz, 4 );
+        k->getNachrichtEncrypted( (char *)&t.laserTempo, 4 );
+        k->getNachrichtEncrypted( (char *)&t.wendigkeit, 8 );
+        k->getNachrichtEncrypted( (char *)&t.antriebEffizienz, 8 );
+        k->getNachrichtEncrypted( (char *)&t.energieSchild, 8 );
+        k->getNachrichtEncrypted( (char *)&t.energieSchildEffizienz, 8 );
+        k->getNachrichtEncrypted( (char *)&t.punkte, 4 );
         Text pf = pfad.getText();
         pf += "/player/";
         pf += t.id;
@@ -271,7 +270,7 @@ bool Editor::nachricht( SKlient *k )
         team.setDatei( pf );
         if( team.open( Datei::Style::schreiben ) )
         {
-            t.save( team.getThis() );
+            t.save( dynamic_cast<Datei *>( team.getThis() ) );
             team.close();
             k->sendeEncrypted( "\1", 1 );
             return 1;
@@ -284,20 +283,20 @@ bool Editor::nachricht( SKlient *k )
     {
         k->sendeEncrypted( "\1", 1 );
         ObjektStr o( 0 );
-        k->getNachrichtEncrypted( (char *)& o.pos.x, 4 );
-        k->getNachrichtEncrypted( (char *)& o.pos.y, 4 );
-        k->getNachrichtEncrypted( (char *)& o.rot, 4 );
-        k->getNachrichtEncrypted( (char *)& o.scale, 4 );
-        k->getNachrichtEncrypted( (char *)& o.id, 4 );
-        k->getNachrichtEncrypted( (char *)& o.m2d, 4 );
-        k->getNachrichtEncrypted( (char *)& o.bild, 4 );
-        k->getNachrichtEncrypted( (char *)& o.style, 4 );
-        k->getNachrichtEncrypted( (char *)& o.maxStability, 4 );
-        k->getNachrichtEncrypted( (char *)& o.maxEnergie, 4 );
-        k->getNachrichtEncrypted( (char *)& o.energieRadius, 4 );
-        k->getNachrichtEncrypted( (char *)& o.reparatur, 8 );
-        k->getNachrichtEncrypted( (char *)& o.akkuLeistung, 8 );
-        k->getNachrichtEncrypted( (char *)& o.team, 1 );
+        k->getNachrichtEncrypted( (char *)&o.pos.x, 4 );
+        k->getNachrichtEncrypted( (char *)&o.pos.y, 4 );
+        k->getNachrichtEncrypted( (char *)&o.rot, 4 );
+        k->getNachrichtEncrypted( (char *)&o.scale, 4 );
+        k->getNachrichtEncrypted( (char *)&o.id, 4 );
+        k->getNachrichtEncrypted( (char *)&o.m2d, 4 );
+        k->getNachrichtEncrypted( (char *)&o.bild, 4 );
+        k->getNachrichtEncrypted( (char *)&o.style, 4 );
+        k->getNachrichtEncrypted( (char *)&o.maxStability, 4 );
+        k->getNachrichtEncrypted( (char *)&o.maxEnergie, 4 );
+        k->getNachrichtEncrypted( (char *)&o.energieRadius, 4 );
+        k->getNachrichtEncrypted( (char *)&o.reparatur, 8 );
+        k->getNachrichtEncrypted( (char *)&o.akkuLeistung, 8 );
+        k->getNachrichtEncrypted( (char *)&o.team, 1 );
         Text pf = pfad.getText();
         pf += "/objekt/";
         pf += o.id;
@@ -306,7 +305,7 @@ bool Editor::nachricht( SKlient *k )
         objekt.setDatei( pf );
         if( objekt.erstellen() && objekt.open( Datei::Style::schreiben ) )
         {
-            o.save( objekt.getThis() );
+            o.save( dynamic_cast<Datei *>( objekt.getThis() ) );
             objekt.close();
             k->sendeEncrypted( "\1", 1 );
             return 1;
@@ -319,7 +318,7 @@ bool Editor::nachricht( SKlient *k )
     {
         k->sendeEncrypted( "\1", 1 );
         int id;
-        k->getNachrichtEncrypted( (char *)& id, 4 );
+        k->getNachrichtEncrypted( (char *)&id, 4 );
         Text pf = pfad.getText();
         pf += "/objekt/";
         pf += id;
@@ -344,7 +343,7 @@ bool Editor::nachricht( SKlient *k )
         {
             k->sendeEncrypted( "\1", 1 );
             int anz = files->getEintragAnzahl();
-            k->sendeEncrypted( (char *)& anz, 4 );
+            k->sendeEncrypted( (char *)&anz, 4 );
             for( int i = 0; i < anz; i++ )
             {
                 Text pf = tmpPf;
@@ -354,7 +353,7 @@ bool Editor::nachricht( SKlient *k )
                 resource.setDatei( pf );
                 resource.open( Datei::Style::lesen );
                 int id = *files->z( i );
-                k->sendeEncrypted( (char *)& id, 4 );
+                k->sendeEncrypted( (char *)&id, 4 );
                 char len = 0;
                 resource.lese( &len, 1 );
                 char *path = new char[ len + 1 ];
@@ -384,10 +383,10 @@ bool Editor::nachricht( SKlient *k )
         {
             k->sendeEncrypted( "\1", 1 );
             int size = 0;
-            d.lese( (char *)& size, 4 );
-            k->sendeEncrypted( (char *)& size, 4 );
-            d.lese( (char *)& size, 4 );
-            k->sendeEncrypted( (char *)& size, 4 );
+            d.lese( (char *)&size, 4 );
+            k->sendeEncrypted( (char *)&size, 4 );
+            d.lese( (char *)&size, 4 );
+            k->sendeEncrypted( (char *)&size, 4 );
             d.close();
         }
         else
@@ -403,7 +402,7 @@ bool Editor::nachricht( SKlient *k )
         k->sendeEncrypted( "\1", 1 );
         Datei d;
         d.setDatei( Text( pfad.getText() ) + "/resource" );
-        RCArray<Text> * list = d.getDateiListe();
+        RCArray<Text> *list = d.getDateiListe();
         int nId = 0;
         bool found = 0;
         do
@@ -421,18 +420,18 @@ bool Editor::nachricht( SKlient *k )
         } while( found );
         list->release();
         unsigned char len = 0;
-        k->getNachrichtEncrypted( (char *)& len, 1 );
+        k->getNachrichtEncrypted( (char *)&len, 1 );
         char *path = new char[ len + 1 ];
         path[ len ] = 0;
         k->getNachrichtEncrypted( path, len );
         d.setDatei( Text( pfad.getText() ) + "/resource/" + nId + ".r" );
         if( d.open( Datei::Style::schreiben ) )
         {
-            d.schreibe( (char *)& len, 1 );
+            d.schreibe( (char *)&len, 1 );
             d.schreibe( path, len );
             d.close();
             k->sendeEncrypted( "\1", 1 );
-            k->sendeEncrypted( (char *)& nId, 4 );
+            k->sendeEncrypted( (char *)&nId, 4 );
             return 1;
         }
         err = "Fehler beim schreiben der Datei.";
@@ -452,21 +451,6 @@ char *Editor::getLetzterFehler() const
     return err;
 }
 
-// Reference Counting 
-ESEditorV *Editor::getThis()
-{
-    ref++;
-    return this;
-}
-
-ESEditorV *Editor::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // privat
 bool Editor::createSitzung()
 {
@@ -481,11 +465,11 @@ bool Editor::createSitzung()
         pf = pfad.getText();
         pf += "/resource/";
         int rAnz = 0;
-        d.lese( (char *)& rAnz, 4 );
+        d.lese( (char *)&rAnz, 4 );
         for( int i = 0; i < rAnz; i++ )
         {
             int id = 0;
-            d.lese( (char *)& id, 4 );
+            d.lese( (char *)&id, 4 );
             Text tmpPf = pf.getText();
             tmpPf += id;
             tmpPf += ".r";
@@ -523,11 +507,11 @@ bool Editor::createSitzung()
             err += "\n";
         }
         __int64 size = 0;
-        d.lese( (char *)& size, 8 );
-        s.schreibe( (char *)& size, 8 );
+        d.lese( (char *)&size, 8 );
+        s.schreibe( (char *)&size, 8 );
         s.close();
         int objAnz = 0;
-        d.lese( (char *)& objAnz, 4 );
+        d.lese( (char *)&objAnz, 4 );
         for( int i = 0; i < objAnz; i++ )
         {
             ObjektStr objStr( &d );
@@ -639,7 +623,7 @@ bool Editor::saveSitzung()
         if( resList )
         {
             int anz = resList->getEintragAnzahl();
-            d.schreibe( (char *)& anz, 4 );
+            d.schreibe( (char *)&anz, 4 );
             for( auto resPf = resList->getIterator(); resPf && resPf._; resPf++ )
             {
                 Text tmp = pf.getText();
@@ -649,8 +633,8 @@ bool Editor::saveSitzung()
                 r.setDatei( tmp );
                 if( r.open( Datei::Style::lesen ) )
                 {
-                    int id = (int)* resPf;
-                    d.schreibe( (char *)& id, 4 );
+                    int id = (int)*resPf;
+                    d.schreibe( (char *)&id, 4 );
                     char b = 0;
                     r.lese( &b, 1 );
                     char *buffer = new char[ b + 1 ];
@@ -683,8 +667,8 @@ bool Editor::saveSitzung()
         if( s.open( Datei::Style::lesen ) )
         {
             __int64 size = 0;
-            s.lese( (char *)& size, 8 );
-            d.schreibe( (char *)& size, 8 );
+            s.lese( (char *)&size, 8 );
+            d.schreibe( (char *)&size, 8 );
             s.close();
         }
         else
@@ -705,7 +689,7 @@ bool Editor::saveSitzung()
         if( objList )
         {
             int anz = objList->getEintragAnzahl();
-            d.schreibe( (char *)& anz, 4 );
+            d.schreibe( (char *)&anz, 4 );
             for( auto objPf = objList->getIterator(); objPf && objPf._; objPf++ )
             {
                 Text tmp = pf.getText();

+ 0 - 4
Asteroids/Editor.h

@@ -11,7 +11,6 @@ class Editor : public ESEditorV
 private:
     Text pfad;
     Text err;
-    int ref;
 
 public:
     // Konstruktor
@@ -24,9 +23,6 @@ public:
     bool nachricht( SKlient *k ) override;
     // constant
     char *getLetzterFehler() const override;
-    // Reference Counting 
-    ESEditorV *getThis() override;
-    ESEditorV *release() override;
 
 private:
     bool createSitzung();

+ 40 - 55
Asteroids/Karte.cpp

@@ -3,57 +3,57 @@
 // Inhalt der Karte Klasse aus Karte.h
 // Konstruktor
 Karte::Karte()
+    : ReferenceCounter()
 {
-	size = Vec2< int >( 0, 0 );
-	ressources = new RCArray< RessourceStr >();
-	objekte = new RCArray< ObjektStr >();
-	spieler = new RCArray< SpielerStr >();
-	teams = new RCArray< TeamStr >();
-	sts = 0;
-	ref = 1;
+    size = Vec2< int >( 0, 0 );
+    ressources = new RCArray< RessourceStr >();
+    objekte = new RCArray< ObjektStr >();
+    spieler = new RCArray< SpielerStr >();
+    teams = new RCArray< TeamStr >();
+    sts = 0;
 }
 
 // Destruktor
 Karte::~Karte()
 {
-	ressources->release();
-	objekte->release();
-	spieler->release();
-	teams->release();
-	if( sts )
-		sts->release();
+    ressources->release();
+    objekte->release();
+    spieler->release();
+    teams->release();
+    if( sts )
+        sts->release();
 }
 
 // nicht constant
 void Karte::ladeDaten( Datei *zDatei, SSDatenbankV *zDb, SpielerTeamStruktur *zSts, char *tmpPfad, int kId )
 {
-	sts = zSts->getThis();
-	int ressourceAnz = 0;
-	zDatei->lese( (char*)&ressourceAnz, 4 );
-	for( int i = 0; i < ressourceAnz; i++ )
+    sts = zSts->getThis();
+    int ressourceAnz = 0;
+    zDatei->lese( (char *)&ressourceAnz, 4 );
+    for( int i = 0; i < ressourceAnz; i++ )
         ressources->add( new RessourceStr( zDatei, zDb, tmpPfad, kId ) );
-	zDatei->lese( (char*)&size.x, 4 );
-	zDatei->lese( (char*)&size.y, 4 );
-	int objektAnzahl = 0;
-	zDatei->lese( (char*)&objektAnzahl, 4 );
-	for( int i = 0; i < objektAnzahl; i++ )
-		objekte->add( new ObjektStr( zDatei ) );
-	for( int i = 0; i < zSts->spielerAnzahl; i++ )
-		spieler->add( new SpielerStr( zDatei ) );
-	for( int i = 0; i < zSts->teamAnzahl; i++ )
-		teams->add( new TeamStr( zDatei ) );
+    zDatei->lese( (char *)&size.x, 4 );
+    zDatei->lese( (char *)&size.y, 4 );
+    int objektAnzahl = 0;
+    zDatei->lese( (char *)&objektAnzahl, 4 );
+    for( int i = 0; i < objektAnzahl; i++ )
+        objekte->add( new ObjektStr( zDatei ) );
+    for( int i = 0; i < zSts->spielerAnzahl; i++ )
+        spieler->add( new SpielerStr( zDatei ) );
+    for( int i = 0; i < zSts->teamAnzahl; i++ )
+        teams->add( new TeamStr( zDatei ) );
 }
 
 // constant
 Vec2< int > Karte::getSize() const
 {
-	return size;
+    return size;
 }
 
 Spieler *Karte::createSpieler( int sNum ) const
 {
-	if( !sts || sNum < 0 || sNum >= sts->spielerAnzahl )
-		return 0;
+    if( !sts || sNum < 0 || sNum >= sts->spielerAnzahl )
+        return 0;
     for( auto s = spieler->getIterator(); s; s++ )
     {
         if( s->id == sNum + 1 )
@@ -62,7 +62,7 @@ Spieler *Karte::createSpieler( int sNum ) const
             for( auto i = ressources->getIterator(); i && i._; i++ )
             {
                 if( i->getId() == s->m2d )
-                    ret->setModelData( i->zReccourceM2()->getThis() );
+                    ret->setModelData( dynamic_cast<Model2DData *>( i->zReccourceM2()->getThis() ) );
             }
             ret->setSpielerFarbe( sts->spielerFarbe->hat( sNum ) ? sts->spielerFarbe->get( sNum ) : 0 );
             return ret;
@@ -73,19 +73,19 @@ Spieler *Karte::createSpieler( int sNum ) const
 
 Team *Karte::createTeam( int tNum ) const
 {
-	if( !sts || tNum < 0 || tNum >= sts->teamAnzahl )
-		return 0;
+    if( !sts || tNum < 0 || tNum >= sts->teamAnzahl )
+        return 0;
     Team *ret = 0;
     for( auto t = teams->getIterator(); t; t++ )
         if( t->id == tNum + 1 )
             ret = new Team( sts->teamFarbe->get( tNum ), sts->teamName->z( tNum )->getText(), t );
-	return ret;
+    return ret;
 }
 
 SpielObjekt *Karte::createObjekt( int oNum ) const
 {
-	if( oNum <= 0 )
-		return 0;
+    if( oNum <= 0 )
+        return 0;
     for( auto o = objekte->getIterator(); o; o++ )
     {
         if( o->id == oNum )
@@ -94,7 +94,7 @@ SpielObjekt *Karte::createObjekt( int oNum ) const
             for( auto i = ressources->getIterator(); i && i._; i++ )
             {
                 if( i->getId() == o->m2d )
-                    ret->setModel( i->zReccourceM2()->getThis() );
+                    ret->setModel( dynamic_cast<Model2DData *>( i->zReccourceM2()->getThis() ) );
             }
             return ret;
         }
@@ -109,30 +109,15 @@ Iterator< ObjektStr * > Karte::getObjekte() const
 
 int Karte::getMaxTeamAnzahl() const
 {
-	return sts ? sts->teamAnzahl : 0;
+    return sts ? sts->teamAnzahl : 0;
 }
 
 int Karte::getMaxSpielerAnzahl() const
 {
-	return sts ? sts->spielerAnzahl : 0;
+    return sts ? sts->spielerAnzahl : 0;
 }
 
 int Karte::getObjektAnzahl() const
 {
-	return objekte->getEintragAnzahl();
-}
-
-// Reference Counting
-Karte *Karte::getThis()
-{
-	ref++;
-	return this;
-}
-
-Karte *Karte::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return objekte->getEintragAnzahl();
 }

+ 20 - 24
Asteroids/Karte.h

@@ -9,36 +9,32 @@
 
 using namespace Framework;
 
-class Karte
+class Karte : public virtual ReferenceCounter
 {
 private:
-	Vec2< int > size;
-	RCArray< RessourceStr > *ressources;
-	RCArray< ObjektStr > *objekte;
-	RCArray< SpielerStr > *spieler;
-	RCArray< TeamStr > *teams;
-	SpielerTeamStruktur *sts;
-	int ref;
+    Vec2< int > size;
+    RCArray< RessourceStr > *ressources;
+    RCArray< ObjektStr > *objekte;
+    RCArray< SpielerStr > *spieler;
+    RCArray< TeamStr > *teams;
+    SpielerTeamStruktur *sts;
 
 public:
-	// Konstruktor
-	Karte();
-	// Destruktor
-	~Karte();
-	// nicht constant
+    // Konstruktor
+    Karte();
+    // Destruktor
+    ~Karte();
+    // nicht constant
     void ladeDaten( Datei *zDatei, SSDatenbankV *zDb, SpielerTeamStruktur *zSts, char *tmpPfad, int kId );
-	// constant
-	Vec2< int > getSize() const;
-	Spieler *createSpieler( int sNum ) const;
-	Team *createTeam( int tNum ) const;
-	SpielObjekt *createObjekt( int oNum ) const;
+    // constant
+    Vec2< int > getSize() const;
+    Spieler *createSpieler( int sNum ) const;
+    Team *createTeam( int tNum ) const;
+    SpielObjekt *createObjekt( int oNum ) const;
     Iterator< ObjektStr * > getObjekte() const;
-	int getMaxTeamAnzahl() const;
-	int getMaxSpielerAnzahl() const;
-	int getObjektAnzahl() const;
-	// Reference Counting
-	Karte *getThis();
-	Karte *release();
+    int getMaxTeamAnzahl() const;
+    int getMaxSpielerAnzahl() const;
+    int getObjektAnzahl() const;
 };
 
 #endif

+ 6 - 6
Asteroids/KartenLeser.cpp

@@ -36,15 +36,15 @@ bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *zSts )
         return 0;
     }
     datei->open( Datei::Style::lesen );
-    datei->lese( (char*)&zSts->spielerAnzahl, 4 );
-    datei->lese( (char*)&zSts->teamAnzahl, 4 );
+    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 );
+        datei->lese( (char *)&farbe, 4 );
         zSts->spielerFarbe->set( farbe, i );
     }
     if( zSts->teamFarbe )
@@ -53,7 +53,7 @@ bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *zSts )
     for( int i = 0; i < zSts->teamAnzahl; i++ )
     {
         int farbe = 0;
-        datei->lese( (char*)&farbe, 4 );
+        datei->lese( (char *)&farbe, 4 );
         zSts->teamFarbe->set( farbe, i );
     }
     if( zSts->teamName )
@@ -76,7 +76,7 @@ bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *zSts )
     for( int i = 0; i < zSts->teamAnzahl; i++ )
     {
         int size = 0;
-        datei->lese( (char*)&size, 4 );
+        datei->lese( (char *)&size, 4 );
         zSts->teamSize->set( size, i );
     }
     datei->close();
@@ -113,7 +113,7 @@ int KartenLeser::getKarteId() const
 
 Text *KartenLeser::getPfad() const
 {
-    return pfad ? pfad->getThis() : 0;
+    return pfad ? dynamic_cast<Text *>( pfad->getThis() ) : 0;
 }
 
 Text *KartenLeser::zPfad() const

+ 6 - 21
Asteroids/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,14 +23,14 @@ 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::sendeInit( RCArray< Spieler > * zSpieler, int spielZeit )
+void Klient::sendeInit( RCArray< Spieler > *zSpieler, int spielZeit )
 {
     if( !klient )
         return;
@@ -326,7 +326,7 @@ void Klient::sendeStatistikSpielerOffline( int account )
     delete[] bytes;
 }
 
-void Klient::sendeSpielerStatistik( SpielerStatistik * zS )
+void Klient::sendeSpielerStatistik( SpielerStatistik *zS )
 {
     if( !zS || !klient )
         return;
@@ -358,7 +358,7 @@ void Klient::sendeSpielerStatistik( SpielerStatistik * zS )
     delete[] bytes;
 }
 
-void Klient::sendeTeamStatistik( TeamStatistik * zS )
+void Klient::sendeTeamStatistik( TeamStatistik *zS )
 {
     if( !zS || !klient )
         return;
@@ -396,19 +396,4 @@ void Klient::sendeStatistikLadenFertig()
 bool Klient::istOnline() const
 {
     return klient != 0;
-}
-
-// reference Counting
-Klient *Klient::getThis()
-{
-    ref++;
-    return this;
-}
-
-Klient *Klient::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 12 - 17
Asteroids/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

+ 27 - 31
Asteroids/SSKlient.h

@@ -12,48 +12,44 @@ 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 sendeInit( RCArray< Spieler > *zSpieler, int spielZeit );
-	void sendeSpielerNummer( int sNum, int spielZeit );
-	void sendeStart( int spielZeit );
-	void sendeTastaturStatus( int spielerId, TastaturStatus ts, bool aktiv, int spielZeit );
-	void sendeSkillNachricht( int sNum, char art, int spielZeit );
+    // Konstruktor
+    Klient( SSKlientV *klient );
+    // Destruktor
+    ~Klient();
+    // nicht constant
+    void offline();
+    void online( SSKlientV *zKlient );
+    void sendeInit( RCArray< Spieler > *zSpieler, int spielZeit );
+    void sendeSpielerNummer( int sNum, int spielZeit );
+    void sendeStart( int spielZeit );
+    void sendeTastaturStatus( int spielerId, TastaturStatus ts, bool aktiv, int spielZeit );
+    void sendeSkillNachricht( int sNum, char art, int spielZeit );
     void sendeUseSkillNachricht( int sNum, char id, int spielZeit );
     void sendeAsteroid( int id, Vertex pos, Vertex speed, float rot, float rotS, int index, int spielZeit );
-	void sendeSchuss( int id, int sNum, Vertex pos, Vertex speed, double intensity, int spielZeit );
+    void sendeSchuss( int id, int sNum, Vertex pos, Vertex speed, double intensity, int spielZeit );
     void sendePixel( int asteroid, int pixelId, int spielZeit );
     void sendeEp( int pixelId, int spielerId, int spielZeit );
-	void sendeTreffer( int id, int sNum, int spielZeit, float ep, int skillP );
+    void sendeTreffer( int id, int sNum, int spielZeit, float ep, int skillP );
     void sendeObjektTreffer( int id, int oId, int spielZeit, float ep, int skillP );
     void sendeObjektTod( int oId, int killSNum, int spielZeit );
     void sendeAsteroidTreffer( int asteroidId, int newAsteroidId, int schussId, Vertex pos, __int64 seed, int spielZeit, float ep, int skillP );
-	void sendeWiederbelebung( int sNum, int spielZeit );
-	void sendeTod( int sNum, int killSNum, int spielZeit );
-	void sendeSpielEnde( char gewonnen, int spielZeit );
-	void sendeChatNachricht( char *txt, int spielZeit );
-	void sendeStatistikChatNachricht( int vonAccount, char *txt );
-	void sendeStatistikSpielerOffline( int account );
-	void sendeSpielerStatistik( SpielerStatistik *zS );
-	void sendeTeamStatistik( TeamStatistik *zS );
-	void sendeStatistikLadenFertig();
-	// constant
-	bool istOnline() const;
-	// reference Counting
-	Klient *getThis();
-	Klient *release();
+    void sendeWiederbelebung( int sNum, int spielZeit );
+    void sendeTod( int sNum, int killSNum, int spielZeit );
+    void sendeSpielEnde( char gewonnen, int spielZeit );
+    void sendeChatNachricht( char *txt, int spielZeit );
+    void sendeStatistikChatNachricht( int vonAccount, char *txt );
+    void sendeStatistikSpielerOffline( int account );
+    void sendeSpielerStatistik( SpielerStatistik *zS );
+    void sendeTeamStatistik( TeamStatistik *zS );
+    void sendeStatistikLadenFertig();
+    // constant
+    bool istOnline() const;
 };
 
 #endif

+ 1 - 15
Asteroids/Skill.cpp

@@ -1,6 +1,7 @@
 #include "Skill.h"
 
 ActiveSkill::ActiveSkill()
+    : ReferenceCounter()
 {
     active = 0;
     time = 0;
@@ -32,8 +33,6 @@ ActiveSkill::ActiveSkill()
     antriebEffizienzFactor = 1;
     energieSchildFactor = 1;
     energieSchildEffizienzFactor = 1;
-
-    ref = 1;
 }
 
 ActiveSkill::~ActiveSkill()
@@ -194,19 +193,6 @@ double ActiveSkill::getEnergieSchildEffizienzFactor()
     return active ? energieSchildEffizienzFactor : 1;
 }
 
-ActiveSkill *ActiveSkill::getThis()
-{
-    ref++;
-    return this;
-}
-
-ActiveSkill *ActiveSkill::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 SpeedBoost::SpeedBoost()
     : ActiveSkill()

+ 3 - 5
Asteroids/Skill.h

@@ -1,12 +1,13 @@
 #pragma once
 
-class ActiveSkill
+#include <ReferenceCounter.h>
+
+class ActiveSkill : public virtual Framework::ReferenceCounter
 {
 protected:
     bool active;
     double time;
     double maxTime;
-    int ref;
     double reloadTimeFactor;
 
     // skill bonus added when active
@@ -70,9 +71,6 @@ public:
     double getAntriebEffizienzFactor();
     double getEnergieSchildFactor();
     double getEnergieSchildEffizienzFactor();
-
-    ActiveSkill *getThis();
-    ActiveSkill *release();
 };
 
 class SpeedBoost : public ActiveSkill

+ 34 - 49
Asteroids/Spiel.cpp

@@ -21,6 +21,7 @@
 // Inhalt der Spiel Klasse aus Spiel.h
 // Konstruktor
 Spiel::Spiel()
+    : ReferenceCounter()
 {
     zAccounts = 0;
     zKlients = 0;
@@ -51,7 +52,6 @@ Spiel::Spiel()
     nextAsteroid = 30;
     asteroidId = 0;
     pixelId = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -89,12 +89,12 @@ int Spiel::getTeamVonSpieler( int sNum )
 }
 
 // nicht constant
-void Spiel::setPSQLK( SSDatenbankV * psqldb )
+void Spiel::setPSQLK( SSDatenbankV *psqldb )
 {
     if( this->psqldb )
         this->psqldb->release();
     this->psqldb = psqldb;
-    stat->setPSQLDB( psqldb->getThis() );
+    stat->setPSQLDB( dynamic_cast<SSDatenbankV *>( psqldb->getThis() ) );
 }
 
 void Spiel::setSpielId( int id )
@@ -115,23 +115,23 @@ void Spiel::setTempPfad( char *pfad )
     mapPfad += "/";
 }
 
-void Spiel::setAccounts( int anzahl, Array< int > * zAccounts )
+void Spiel::setAccounts( int anzahl, Array< int > *zAccounts )
 {
-    this->zAccounts = zAccounts->getThis();
+    this->zAccounts = dynamic_cast<Array<int> *>( zAccounts->getThis() );
     spielerAnzahl = anzahl;
 }
 
-void Spiel::setKlients( int anzahl, RCArray< SSKlientV > * zKlients )
+void Spiel::setKlients( int anzahl, RCArray< SSKlientV > *zKlients )
 {
-    this->zKlients = zKlients->getThis();
+    this->zKlients = dynamic_cast<RCArray<SSKlientV> *>( zKlients->getThis() );
 }
 
-void Spiel::setSpielerNummern( int anzahl, Array< int > * spielerNummern )
+void Spiel::setSpielerNummern( int anzahl, Array< int > *spielerNummern )
 {
     if( !sts )
     {
         sts = new SpielerTeamStruktur();
-        KartenLeser *reader = new KartenLeser( karteId, psqldb->getThis(), mapPfad );
+        KartenLeser *reader = new KartenLeser( karteId, dynamic_cast<SSDatenbankV *>( psqldb->getThis() ), mapPfad );
         reader->ladeSpielerTeamStruktur( sts );
         if( karte )
             karte->release();
@@ -139,12 +139,12 @@ void Spiel::setSpielerNummern( int anzahl, Array< int > * spielerNummern )
         reader->release();
         for( int i = 0; i < sts->teamAnzahl; i++ )
             teams->set( karte->createTeam( i ), i );
-        stat->setTeamNamen( sts->teamName->getThis() );
+        stat->setTeamNamen( dynamic_cast<RCArray<Text> *>( sts->teamName->getThis() ) );
         for( auto o = karte->getObjekte(); o; o++ )
         {
             SpielObjekt *obj = karte->createObjekt( o->id );
             obj->setTeam( teams->get( o->team - 1 ) );
-            welt->addObject( obj->getThis() );
+            welt->addObject( dynamic_cast<SpielObjekt *>( obj->getThis() ) );
             objekte->add( obj );
         }
         welt->setSize( karte->getSize().x, karte->getSize().y );
@@ -171,7 +171,7 @@ void Spiel::setSpielerNummern( int anzahl, Array< int > * spielerNummern )
             tmp->setTeam( teams->get( team ) );
             teams->z( team )->spieler->add( tmp );
         }
-        welt->addObject( tmp->getThis() );
+        welt->addObject( dynamic_cast<Spieler *>( tmp->getThis() ) );
         spieler->set( tmp, i );
     }
     for( int i = 0; i < anzahl; i++ )
@@ -179,8 +179,8 @@ void Spiel::setSpielerNummern( int anzahl, Array< int > * spielerNummern )
     for( int i = 0; i < anzahl; i++ )
         spieler->z( i )->setKlient( new Klient( zKlients->get( i ) ) );
     stat->setSpieler( spielerAnzahl, spieler );
-    zAccounts = zAccounts->release();
-    zKlients = zKlients->release();
+    zAccounts = ( Array<int>* )zAccounts->release();
+    zKlients = ( RCArray<SSKlientV>* )zKlients->release();
     teamAnzahl = 0;
     for( int i = 0; i < sts->teamAnzahl; i++ )
         if( teams->z( i )->spieler->getEintragAnzahl() )
@@ -196,7 +196,7 @@ void Spiel::klientOffline( int accountId )
     }
 }
 
-void Spiel::klientOnline( int accountId, SSKlientV * zKlient )
+void Spiel::klientOnline( int accountId, SSKlientV *zKlient )
 {
     for( int i = 0; i < spielerAnzahl; i++ )
     {
@@ -353,9 +353,9 @@ void Spiel::nachricht( int accountId, int len, char *bytes )
                 break;
             }
         }
-        log->schreibe( (char *)& spielerNum, 4 );
+        log->schreibe( (char *)&spielerNum, 4 );
         short l = (short)msgLen;
-        log->schreibe( (char *)& l, 2 );
+        log->schreibe( (char *)&l, 2 );
         log->schreibe( msgBeg, l );
     }
     LeaveCriticalSection( &cs );
@@ -500,7 +500,7 @@ void Spiel::tick( double zeit )
                     Vertex pos;
                     __int64 seed = randG.getSeed();
                     double intens = tmp->getIntensity() * ( ( tmp->getSpeed() - a->getSpeed() ).getLength() / 200 );
-                    Asteroid * b = a->istTreffer( tmp, &randG, asteroidId, pos );
+                    Asteroid *b = a->istTreffer( tmp, &randG, asteroidId, pos );
                     if( b )
                     {
                         float erf = 0;
@@ -525,13 +525,13 @@ void Spiel::tick( double zeit )
                         shots->remove( i );
                         if( b->getMasse() > intens * 50 )
                         {
-                            asteroids->add( (Asteroid *)b->getThis() );
+                            asteroids->add( dynamic_cast<Asteroid *>( b->getThis() ) );
                             welt->addObject( b );
                         }
                         else
                         {
                             Pixel *p = new Pixel( b->getPosition(), b->getSpeed(), b->getMasse() / 50, pixelId++ );
-                            welt->addObject( p->getThis() );
+                            welt->addObject( dynamic_cast<Pixel *>( p->getThis() ) );
                             pixel->add( p );
                             for( int k = 0; k < spielerAnzahl; k++ )
                             {
@@ -544,7 +544,7 @@ void Spiel::tick( double zeit )
                         if( a->getMasse() < intens * 50 )
                         {
                             Pixel *p = new Pixel( a->getPosition(), a->getSpeed(), a->getMasse() / 50, pixelId++ );
-                            welt->addObject( p->getThis() );
+                            welt->addObject( dynamic_cast<Pixel *>( p->getThis() ) );
                             pixel->add( p );
                             for( int k = 0; k < spielerAnzahl; k++ )
                             {
@@ -571,7 +571,7 @@ void Spiel::tick( double zeit )
             if( nL )
             {
                 nextSchussId++;
-                welt->addObject( nL->getThis() );
+                welt->addObject( dynamic_cast<Laser *>( nL->getThis() ) );
                 shots->add( nL );
                 for( int j = 0; j < spielerAnzahl; j++ )
                 {
@@ -595,7 +595,7 @@ void Spiel::tick( double zeit )
             int index = (int)( (float)asteroidModels->getEintragAnzahl() * (float)randG.rand() );
             Asteroid *astr = new Asteroid( asteroidId++, pos, speed, rot, rotS, asteroidModels->get( index ) );
             asteroids->add( astr );
-            welt->addObject( astr->getThis() );
+            welt->addObject( dynamic_cast<Asteroid *>( astr->getThis() ) );
             for( int j = 0; j < spielerAnzahl; j++ )
             {
                 if( spieler->z( j ) && spieler->z( j )->zKlient() )
@@ -666,7 +666,7 @@ void Spiel::run()
     time_t t;
     time( &t );
     srand( (unsigned int)t );
-    log->schreibe( (char *)& spielerAnzahl, 4 );
+    log->schreibe( (char *)&spielerAnzahl, 4 );
     for( int i = 0; i < spielerAnzahl; i++ )
     {
         Spieler *tmp = spieler->z( i );
@@ -675,17 +675,17 @@ void Spiel::run()
             tmp->addSkill( new ShieldBoost() );
             tmp->addSkill( new SpeedBoost() );
             tmp->zKlient()->sendeInit( spieler, -1 );
-            log->schreibe( (char *)& i, 4 );
+            log->schreibe( (char *)&i, 4 );
             int sNum = tmp->getSpielerNummer();
-            log->schreibe( (char *)& sNum, 4 );
+            log->schreibe( (char *)&sNum, 4 );
             tmp->zKlient()->sendeSpielerNummer( sNum, -1 );
             int team = tmp->zTeam()->id;
-            log->schreibe( (char *)& team, 4 );
+            log->schreibe( (char *)&team, 4 );
             int farbe = tmp->getSpielerFarbe();
-            log->schreibe( (char *)& farbe, 4 );
+            log->schreibe( (char *)&farbe, 4 );
             farbe = tmp->zTeam()->farbe;
-            log->schreibe( (char *)& farbe, 4 );
-            Text * name = psqldb->getAccountRufName( tmp->getAccountId() );
+            log->schreibe( (char *)&farbe, 4 );
+            Text *name = psqldb->getAccountRufName( tmp->getAccountId() );
             char len = (char)( name ? name->getLength() : 0 );
             log->schreibe( &len, 1 );
             if( len )
@@ -700,9 +700,9 @@ void Spiel::run()
         }
     }
     __int64 randSeed = randG.getSeed();
-    log->schreibe( (char *)& randSeed, 8 );
+    log->schreibe( (char *)&randSeed, 8 );
     Array< char > spielerStatus;
-    ZeitMesser * zeit = new ZeitMesser();
+    ZeitMesser *zeit = new ZeitMesser();
     zeit->messungStart();
     isRunning = 1;
     ende = 0;
@@ -771,27 +771,12 @@ void Spiel::run()
         }
     }
     log->close();
-    log = log->release();
+    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() );
 }

+ 40 - 44
Asteroids/Spiel.h

@@ -21,59 +21,55 @@ private:
     RandomGenerator randG;
     RCArray< Asteroid > *asteroids;
     RCArray< Model2DData > *asteroidModels;
-	Statistik *stat;
-	RCArray< Team > *teams;
-	int teamAnzahl;
-	Array< int > *zAccounts;
-	RCArray< SSKlientV > *zKlients;
-	RCArray< Spieler > *spieler;
-	RCArray< Laser > *shots;
-	RCArray< SpielObjekt > *objekte;
+    Statistik *stat;
+    RCArray< Team > *teams;
+    int teamAnzahl;
+    Array< int > *zAccounts;
+    RCArray< SSKlientV > *zKlients;
+    RCArray< Spieler > *spieler;
+    RCArray< Laser > *shots;
+    RCArray< SpielObjekt > *objekte;
     RCArray< Pixel > *pixel;
     Welt2D *welt;
-	SSDatenbankV *psqldb;
-	int spielId;
-	int karteId;
-	int spielerAnzahl;
-	Karte *karte;
-	CRITICAL_SECTION cs;
-	SpielerTeamStruktur *sts;
-	Datei *log;
+    SSDatenbankV *psqldb;
+    int spielId;
+    int karteId;
+    int spielerAnzahl;
+    Karte *karte;
+    CRITICAL_SECTION cs;
+    SpielerTeamStruktur *sts;
+    Datei *log;
     Text mapPfad;
-	bool isRunning;
-	int spielZeit;
-	bool ende;
-	int nextSchussId;
+    bool isRunning;
+    int spielZeit;
+    bool ende;
+    int nextSchussId;
     double nextAsteroid;
     int asteroidId;
     int pixelId;
-	int ref;
-	// privat
-	int getTeamVonSpieler( int sNum );
+    // privat
+    int getTeamVonSpieler( int sNum );
 
 public:
-	// Konstruktor
-	Spiel();
-	// Destruktor
-	~Spiel();
-	// nicht constant
-	virtual void setPSQLK( SSDatenbankV *psqldb ); // call 1
-	virtual void setSpielId( int id ); // call 2
-	virtual void setKarteId( int karteId ); // call 3
+    // Konstruktor
+    Spiel();
+    // Destruktor
+    ~Spiel();
+    // nicht constant
+    virtual void setPSQLK( SSDatenbankV *psqldb ); // call 1
+    virtual void setSpielId( int id ); // call 2
+    virtual void setKarteId( int karteId ); // call 3
     virtual void setTempPfad( char *pfad ); // call 3.5
-	virtual void setAccounts( int anzahl, Array< int > *zAccounts ); // call 4
-	virtual void setKlients( int anzahl, RCArray< SSKlientV > *zKlients ); // call 5
-	virtual void setSpielerNummern( int anzahl, Array< int > *spielerNummern ); // call 6
-	virtual void klientOffline( int accountId );
-	virtual void klientOnline( int accountId, SSKlientV *zKlient );
-	virtual void nachricht( int accountId, int len, char *bytes );
-	void tick( double zeit );
-	virtual void run(); // call 7
-	// constant
-	virtual StatistikV *getStatistik() const;
-	// Reference Counting 
-	virtual SpielKlasse *getThis();
-	virtual SpielKlasse *release();
+    virtual void setAccounts( int anzahl, Array< int > *zAccounts ); // call 4
+    virtual void setKlients( int anzahl, RCArray< SSKlientV > *zKlients ); // call 5
+    virtual void setSpielerNummern( int anzahl, Array< int > *spielerNummern ); // call 6
+    virtual void klientOffline( int accountId );
+    virtual void klientOnline( int accountId, SSKlientV *zKlient );
+    virtual void nachricht( int accountId, int len, char *bytes );
+    void tick( double zeit );
+    virtual void run(); // call 7
+    // constant
+    virtual StatistikV *getStatistik() const;
 };
 
 #endif

+ 15 - 19
Asteroids/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

+ 3 - 18
Asteroids/Spieler.cpp

@@ -327,7 +327,7 @@ bool Spieler::setTastataturStatus( TastaturStatus ts, bool aktiv )
     return 1;
 }
 
-bool Spieler::tick( const WeltInfo& info, double zeit )
+bool Spieler::tick( const WeltInfo &info, double zeit )
 {
     wInfo = info;
     if( !team )
@@ -489,8 +489,8 @@ Laser *Spieler::getLaser( int sId )
     if( !amLeben || !tastatur[ T_FEUER ] || schussAbk || !team )
         return 0;
     double kosten = ( calculateLaserIntensity() / 2 +
-        calculateLaserTempo() / 9 ) *
-                      ( 1 / ( calculateLaserEffizienz() / 25 ) );
+                      calculateLaserTempo() / 9 ) *
+        ( 1 / ( calculateLaserEffizienz() / 25 ) );
     if( kosten < 1 )
         kosten = 1;
     if( kosten > energie )
@@ -772,19 +772,4 @@ int Spieler::getSkillP() const
 int Spieler::getLevel() const
 {
     return level;
-}
-
-// Reference Counting
-Spieler *Spieler::getThis()
-{
-    ref++;
-    return this;
-}
-
-Spieler *Spieler::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 90 - 93
Asteroids/Spieler.h

@@ -16,11 +16,11 @@ using namespace Framework;
 
 enum TastaturStatus
 {
-	T_GAS,
-	T_ROT_L,
-	T_ROT_R,
-	T_FEUER,
-	T_MAX
+    T_GAS,
+    T_ROT_L,
+    T_ROT_R,
+    T_FEUER,
+    T_MAX
 };
 
 class Spieler : public Model2DObject
@@ -37,47 +37,47 @@ private:
     RCArray< ActiveSkill > *activeSkills;
 
     int level;
-	int accountId;
-	int sNum;
-	int farbe;
-	Team *team;
-	Klient *klient;
-	bool tastatur[ T_MAX ];
-	bool amLeben;
-	double schussAbk;
+    int accountId;
+    int sNum;
+    int farbe;
+    Team *team;
+    Klient *klient;
+    bool tastatur[ T_MAX ];
+    bool amLeben;
+    double schussAbk;
     double energieAbk;
-	double repAbk;
-	double reinkAbk;
-	int maxReinkAbk;
-	// Raumschiff Eigenschaftend
-	Vertex startPos;
-	double beschleunigung;
-	double energie;
-	double stability;
-	double reparatur;
-	double laserIntensity;
-	double laserEffizienz;
-	double akkuLeistung;
-	double maxEnergie;
-	double maxStability;
-	double laserTempo;
-	double netzwerk;
-	double wendigkeit;
+    double repAbk;
+    double reinkAbk;
+    int maxReinkAbk;
+    // Raumschiff Eigenschaftend
+    Vertex startPos;
+    double beschleunigung;
+    double energie;
+    double stability;
+    double reparatur;
+    double laserIntensity;
+    double laserEffizienz;
+    double akkuLeistung;
+    double maxEnergie;
+    double maxStability;
+    double laserTempo;
+    double netzwerk;
+    double wendigkeit;
     double antriebEffizienz;
     double energieSchild;
     double energieSchildEffizienz;
-	int skillPunkte;
-	// Statistik Werte
-	double schadenBekommen;
-	double schadenGemacht;
-	double treibstoffVerbraucht;
-	int shots;
-	int treffer;
-	int punkte;
-	int kills;
-	int tode;
-	double zeitAmLeben;
-	double zeitTod;
+    int skillPunkte;
+    // Statistik Werte
+    double schadenBekommen;
+    double schadenGemacht;
+    double treibstoffVerbraucht;
+    int shots;
+    int treffer;
+    int punkte;
+    int kills;
+    int tode;
+    double zeitAmLeben;
+    double zeitTod;
     float ep;
     float nextSkillEp;
     bool needWiederbelebung;
@@ -96,70 +96,67 @@ private:
     double calculateEnergieSchildEffizienz();
 
 public:
-	// Konstruktor
-	Spieler( SpielerStr *zStr );
-	// Destruktor
-	~Spieler();
-	// nicht constant
+    // Konstruktor
+    Spieler( SpielerStr *zStr );
+    // Destruktor
+    ~Spieler();
+    // nicht constant
     void addSkill( ActiveSkill *skill );
     void useSkill( int id );
-	void offline();
-	void online( SSKlientV *zKlient );
-	void setModelData( Model2DData *data );
-	void setAccountId( int id );
-	void setTeam( Team *team );
-	void setSpielerFarbe( int farbe );
-	void setKlient( Klient *klient );
-	bool setTastataturStatus( TastaturStatus ts, bool aktiv );
-	bool tick( const WeltInfo &info, double zeit ) override;
-	bool setSkill( int art );
-	Laser *getLaser( int sId );
-	bool nimmSchaden( double &intensity, int sLevel );
-	void machSchaden( double intensity, int sLevel, bool erf = 1 );
+    void offline();
+    void online( SSKlientV *zKlient );
+    void setModelData( Model2DData *data );
+    void setAccountId( int id );
+    void setTeam( Team *team );
+    void setSpielerFarbe( int farbe );
+    void setKlient( Klient *klient );
+    bool setTastataturStatus( TastaturStatus ts, bool aktiv );
+    bool tick( const WeltInfo &info, double zeit ) override;
+    bool setSkill( int art );
+    Laser *getLaser( int sId );
+    bool nimmSchaden( double &intensity, int sLevel );
+    void machSchaden( double intensity, int sLevel, bool erf = 1 );
     void addKill( int sLevel, bool erf = 1 );
     void addTreffer( float intensity, int sLevel, bool erf = 1 );
     void wiederbeleben();
     void addEp( float ep );
-	// constant
-	int getAccountId() const;
-	bool istOnline() const;
-	Klient *zKlient() const;
-	bool istTreffer( Vec2< float > pos ) const;
-	// Raumschiff Eigenschaften
-	double getTeamMaxEnergieBonus() const;
-	double getTeamMaxStabilityBonus() const;
-	double getTeamReparaturBonus() const;
-	double getTeamLaserIntensityBonus() const;
-	double getTeamLaserEffizienzBonus() const;
-	double getTeamAkkuLeistungBonus() const;
-	double getTeamLaserTempoBonus() const;
-	double getTeamBeschleunigungBonus() const;
-	double getTeamWendigkeitBonus() const;
+    // constant
+    int getAccountId() const;
+    bool istOnline() const;
+    Klient *zKlient() const;
+    bool istTreffer( Vec2< float > pos ) const;
+    // Raumschiff Eigenschaften
+    double getTeamMaxEnergieBonus() const;
+    double getTeamMaxStabilityBonus() const;
+    double getTeamReparaturBonus() const;
+    double getTeamLaserIntensityBonus() const;
+    double getTeamLaserEffizienzBonus() const;
+    double getTeamAkkuLeistungBonus() const;
+    double getTeamLaserTempoBonus() const;
+    double getTeamBeschleunigungBonus() const;
+    double getTeamWendigkeitBonus() const;
     double getTeamAntriebEffizienzBonus() const;
     double getTeamEnergieSchildBonus() const;
     double getTeamEnergieSchildEffizienzBonus() const;
-	bool istAmLeben() const;
-	// Statistik Werte
-	int getSpielerNummer() const;
-	Team *zTeam() const;
-	int getSpielerFarbe() const;
-	int getSchadenBekommen() const;
-	int getSchadenGemacht() const;
-	int getTreibstoffVerbraucht() const;
-	int getShots() const;
-	int getTreffer() const;
-	int getPunkte() const;
-	int getKills() const;
-	int getTode() const;
-	int getZeitAmLeben() const;
-	int getZeitTod() const;
+    bool istAmLeben() const;
+    // Statistik Werte
+    int getSpielerNummer() const;
+    Team *zTeam() const;
+    int getSpielerFarbe() const;
+    int getSchadenBekommen() const;
+    int getSchadenGemacht() const;
+    int getTreibstoffVerbraucht() const;
+    int getShots() const;
+    int getTreffer() const;
+    int getPunkte() const;
+    int getKills() const;
+    int getTode() const;
+    int getZeitAmLeben() const;
+    int getZeitTod() const;
     bool doNeedWiederbelebung() const;
     float getEp() const;
     int getSkillP() const;
     int getLevel() const;
-	// Reference Counting
-	Spieler *getThis();
-	Spieler *release();
 };
 
 #endif

+ 67 - 82
Asteroids/SpielerStatistik.cpp

@@ -3,165 +3,150 @@
 // Inhalt der SpielerStatistik Klasse aus SpielerStatistik.h
 // Konstruktor
 SpielerStatistik::SpielerStatistik()
-{
-	spielerNummer = 0;
-	spielerName = new Text();
-	teamName = new Text();
-	spielerFarbe = 0;
-	teamFarbe = 0;
-	schadenBekommen = 0;
-	schadenGemacht = 0;
-	treibstoffVerbraucht = 0;
-	shots = 0;
-	treffer = 0;
-	punkte = 0;
-	kills = 0;
-	tode = 0;
-	zeitAmLeben = 0;
-	zeitTod = 0;
-	ref = 1;
+    : ReferenceCounter()
+{
+    spielerNummer = 0;
+    spielerName = new Text();
+    teamName = new Text();
+    spielerFarbe = 0;
+    teamFarbe = 0;
+    schadenBekommen = 0;
+    schadenGemacht = 0;
+    treibstoffVerbraucht = 0;
+    shots = 0;
+    treffer = 0;
+    punkte = 0;
+    kills = 0;
+    tode = 0;
+    zeitAmLeben = 0;
+    zeitTod = 0;
 }
 
 // Destruktor
 SpielerStatistik::~SpielerStatistik()
 {
-	spielerName->release();
-	teamName->release();
+    spielerName->release();
+    teamName->release();
 }
 
 // nicht constant
 void SpielerStatistik::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( "SchadenBekommen" ) )
-		schadenBekommen = *dat->zWert( "SchadenBekommen" );
-	if( dat->wertExistiert( "SchadenGemacht" ) )
-		schadenGemacht = *dat->zWert( "SchadenGemacht" );
-	if( dat->wertExistiert( "TreibstoffVerbraucht" ) )
-		treibstoffVerbraucht = *dat->zWert( "TreibstoffVerbraucht" );
-	if( dat->wertExistiert( "Schüsse" ) )
-		shots = *dat->zWert( "Schüsse" );
-	if( dat->wertExistiert( "Treffer" ) )
-		treffer = *dat->zWert( "Treffer" );
-	if( dat->wertExistiert( "Punkte" ) )
-		punkte = *dat->zWert( "Punkte" );
-	if( dat->wertExistiert( "Kills" ) )
-		kills = *dat->zWert( "Kills" );
-	if( dat->wertExistiert( "Tode" ) )
-		tode = *dat->zWert( "Tode" );
-	if( dat->wertExistiert( "ZeitAmLeben" ) )
-		zeitAmLeben = *dat->zWert( "ZeitAmLeben" );
-	if( dat->wertExistiert( "ZeitTod" ) )
-		zeitTod = *dat->zWert( "ZeitTod" );
-	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( "SchadenBekommen" ) )
+        schadenBekommen = *dat->zWert( "SchadenBekommen" );
+    if( dat->wertExistiert( "SchadenGemacht" ) )
+        schadenGemacht = *dat->zWert( "SchadenGemacht" );
+    if( dat->wertExistiert( "TreibstoffVerbraucht" ) )
+        treibstoffVerbraucht = *dat->zWert( "TreibstoffVerbraucht" );
+    if( dat->wertExistiert( "Schüsse" ) )
+        shots = *dat->zWert( "Schüsse" );
+    if( dat->wertExistiert( "Treffer" ) )
+        treffer = *dat->zWert( "Treffer" );
+    if( dat->wertExistiert( "Punkte" ) )
+        punkte = *dat->zWert( "Punkte" );
+    if( dat->wertExistiert( "Kills" ) )
+        kills = *dat->zWert( "Kills" );
+    if( dat->wertExistiert( "Tode" ) )
+        tode = *dat->zWert( "Tode" );
+    if( dat->wertExistiert( "ZeitAmLeben" ) )
+        zeitAmLeben = *dat->zWert( "ZeitAmLeben" );
+    if( dat->wertExistiert( "ZeitTod" ) )
+        zeitTod = *dat->zWert( "ZeitTod" );
+    dat->release();
 }
 
 // constant
 int SpielerStatistik::getSpielerNummer() const
 {
-	return spielerNummer;
+    return spielerNummer;
 }
 
 Text *SpielerStatistik::getSpielerName() const
 {
-	return spielerName ? spielerName->getThis() : 0;
+    return spielerName ? dynamic_cast<Text *>( spielerName->getThis() ) : 0;
 }
 
 Text *SpielerStatistik::zSpielerName() const
 {
-	return spielerName;
+    return spielerName;
 }
 
 Text *SpielerStatistik::getTeamName() const
 {
-	return teamName ? teamName->getThis() : 0;
+    return teamName ? dynamic_cast<Text *>( teamName->getThis() ) : 0;
 }
 
 Text *SpielerStatistik::zTeamName() const
 {
-	return teamName;
+    return teamName;
 }
 
 int SpielerStatistik::getSpielerFarbe() const
 {
-	return spielerFarbe;
+    return spielerFarbe;
 }
 
 int SpielerStatistik::getTeamFarbe() const
 {
-	return teamFarbe;
+    return teamFarbe;
 }
 
 int SpielerStatistik::getSchadenBekommen() const
 {
-	return schadenBekommen;
+    return schadenBekommen;
 }
 
 int SpielerStatistik::getSchadenGemacht() const
 {
-	return schadenGemacht;
+    return schadenGemacht;
 }
 
 int SpielerStatistik::getTreibstoffVerbraucht() const
 {
-	return treibstoffVerbraucht;
+    return treibstoffVerbraucht;
 }
 
 int SpielerStatistik::getShots() const
 {
-	return shots;
+    return shots;
 }
 
 int SpielerStatistik::getTreffer() const
 {
-	return treffer;
+    return treffer;
 }
 
 int SpielerStatistik::getPunkte() const
 {
-	return punkte;
+    return punkte;
 }
 
 int SpielerStatistik::getZeitAmLeben() const
 {
-	return zeitAmLeben;
+    return zeitAmLeben;
 }
 
 int SpielerStatistik::getZeitTod() const
 {
-	return zeitTod;
+    return zeitTod;
 }
 
 int SpielerStatistik::getKills() const
 {
-	return kills;
+    return kills;
 }
 
 int SpielerStatistik::getTode() const
 {
-	return tode;
-}
-
-// Reference Counting
-SpielerStatistik *SpielerStatistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-SpielerStatistik *SpielerStatistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return tode;
 }

+ 40 - 44
Asteroids/SpielerStatistik.h

@@ -6,54 +6,50 @@
 
 using namespace Framework;
 
-class SpielerStatistik
+class SpielerStatistik : public virtual ReferenceCounter
 {
 private:
-	int spielerNummer;
-	Text *spielerName;
-	Text *teamName;
-	int spielerFarbe;
-	int teamFarbe;
-	int schadenBekommen;
-	int schadenGemacht;
-	int treibstoffVerbraucht;
-	int shots;
-	int treffer;
-	int punkte;
-	int kills;
-	int tode;
-	int zeitAmLeben;
-	int zeitTod;
-	int ref;
+    int spielerNummer;
+    Text *spielerName;
+    Text *teamName;
+    int spielerFarbe;
+    int teamFarbe;
+    int schadenBekommen;
+    int schadenGemacht;
+    int treibstoffVerbraucht;
+    int shots;
+    int treffer;
+    int punkte;
+    int kills;
+    int tode;
+    int zeitAmLeben;
+    int zeitTod;
 
 public:
-	// Konstruktor
-	SpielerStatistik();
-	// Destruktor
-	~SpielerStatistik();
-	// 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 getSchadenBekommen() const;
-	int getSchadenGemacht() const;
-	int getTreibstoffVerbraucht() const;
-	int getShots() const;
-	int getTreffer() const;
-	int getPunkte() const;
-	int getZeitAmLeben() const;
-	int getZeitTod() const;
-	int getKills() const;
-	int getTode() const;
-	// Reference Counting
-	SpielerStatistik *getThis();
-	SpielerStatistik *release();
+    // Konstruktor
+    SpielerStatistik();
+    // Destruktor
+    ~SpielerStatistik();
+    // 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 getSchadenBekommen() const;
+    int getSchadenGemacht() const;
+    int getTreibstoffVerbraucht() const;
+    int getShots() const;
+    int getTreffer() const;
+    int getPunkte() const;
+    int getZeitAmLeben() const;
+    int getZeitTod() const;
+    int getKills() const;
+    int getTode() const;
 };
 
 #endif

+ 262 - 277
Asteroids/Statistik.cpp

@@ -11,331 +11,316 @@
 // 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< SpielerStatistik >();
-	gts = new RCArray< TeamStatistik >();
-	teamNamen = 0;
-	gewinnerTeam = 0;
-	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< SpielerStatistik >();
+    gts = new RCArray< TeamStatistik >();
+    teamNamen = 0;
+    gewinnerTeam = 0;
 }
 
 // Destruktor
 Statistik::~Statistik()
 {
-	if( db )
-		db->release();
+    if( db )
+        db->release();
     for( auto s = spieler->getIterator(); s; s++ )
         s->setTeam( 0 );
-	spieler->release();
-	sOnline->release();
-	sBereit->release();
-	gss->release();
-	gts->release();
-	if( teamNamen )
-		teamNamen->release();
+    spieler->release();
+    sOnline->release();
+    sBereit->release();
+    gss->release();
+    gts->release();
+    if( teamNamen )
+        teamNamen->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->sendeSpielerStatistik( gss->z( i ) );
-	anz = gts->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		zk->sendeTeamStatistik( gts->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->sendeSpielerStatistik( gss->z( i ) );
+    anz = gts->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        zk->sendeTeamStatistik( gts->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::spielEnde( int team )
 {
-	gewinnerTeam = team;
+    gewinnerTeam = team;
 }
 
 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 0: // 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 1: // 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 0: // 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 1: // 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();
-			d->addWert( "TeamName", tmp->zTeam()->name );
-			w = tmp->getSpielerFarbe();
-			if( w.getLength() )
-				d->addWert( "SpielerFarbe", w.getText() );
-			w = tmp->zTeam()->farbe;
-			if( w.getLength() )
-				d->addWert( "TeamFarbe", w.getText() );
-			w = tmp->getSchadenBekommen();
-			if( w.getLength() )
-				d->addWert( "SchadenBekommen", w.getText() );
-			w = tmp->getSchadenGemacht();
-			if( w.getLength() )
-				d->addWert( "SchadenGemacht", w.getText() );
-			w = tmp->getTreibstoffVerbraucht();
-			if( w.getLength() )
-				d->addWert( "TreibstoffVerbraucht", w.getText() );
-			w = tmp->getShots();
-			if( w.getLength() )
-				d->addWert( "Schüsse", w.getText() );
-			w = tmp->getTreffer();
-			if( w.getLength() )
-				d->addWert( "Treffer", w.getText() );
-			w = tmp->getPunkte();
-			if( w.getLength() )
-				d->addWert( "Punkte", w.getText() );
-			w = tmp->getKills();
-			if( w.getLength() )
-				d->addWert( "Kills", w.getText() );
-			w = tmp->getTode();
-			if( w.getLength() )
-				d->addWert( "Tode", w.getText() );
-			w = tmp->getZeitAmLeben();
-			if( w.getLength() )
-				d->addWert( "ZeitAmLeben", w.getText() );
-			w = tmp->getZeitTod();
-			if( w.getLength() )
-				d->addWert( "ZeitTod", w.getText() );
-			SpielerStatistik *gss = new SpielerStatistik();
-			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->zTeam()->id )
-				{
-					gefunden = 1;
-					break;
-				}
-			}
-			if( gefunden )
-				continue;
-			InitDatei *d = new InitDatei();
-			Text w;
-			w = tmp->zTeam()->id;
-			if( w.getLength() )
-				d->addWert( "TeamNummer", w.getText() );
-			d->addWert( "TeamName", tmp->zTeam()->name );
-			w = tmp->zTeam()->farbe;
-			if( w.getLength() )
-				d->addWert( "TeamFarbe", w.getText() );
-			int schadenBekommen = 0;
-			int schadenGemacht = 0;
-			int treibstoffVerbraucht = 0;
-			int shots = 0;
-			int treffer = 0;
-			int punkte = 0;
-			int kills = 0;
-			int tode = 0;
-			for( int j = 0; j < spielerAnzahl; j++ )
-			{
-				Spieler *s = spieler->z( j );
-				if( s && s->zTeam()->id == tmp->zTeam()->id )
-				{
-					schadenBekommen += s->getSchadenBekommen();
-					schadenGemacht += s->getSchadenGemacht();
-					treibstoffVerbraucht += s->getTreibstoffVerbraucht();
-					shots += s->getShots();
-					treffer += s->getTreffer();
-					punkte += s->getPunkte();
-					kills += s->getKills();
-					tode += s->getTode();
-				}
-			}
-			w = schadenBekommen;
-			if( w.getLength() )
-				d->addWert( "SchadenBekommen", w.getText() );
-			w = schadenGemacht;
-			if( w.getLength() )
-				d->addWert( "SchadenGemacht", w.getText() );
-			w = treibstoffVerbraucht;
-			if( w.getLength() )
-				d->addWert( "TreibstoffVerbraucht", w.getText() );
-			w = shots;
-			if( w.getLength() )
-				d->addWert( "Schüsse", w.getText() );
-			w = treffer;
-			if( w.getLength() )
-				d->addWert( "Treffer", w.getText() );
-			w = punkte;
-			if( w.getLength() )
-				d->addWert( "Punkte", w.getText() );
-			w = kills;
-			if( w.getLength() )
-				d->addWert( "Kills", w.getText() );
-			w = tode;
-			if( w.getLength() )
-				d->addWert( "Tode", w.getText() );
-			w = (int)( gewinnerTeam == tmp->zTeam()->id );
-			if( w.getLength() )
-				d->addWert( "Gewonnen", w.getText() );
-			TeamStatistik *gts = new TeamStatistik();
-			gts->initValues( d );
-			this->gts->add( gts );
-		}
-	}
-	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;
-	}
-}
-
-// 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();
+            d->addWert( "TeamName", tmp->zTeam()->name );
+            w = tmp->getSpielerFarbe();
+            if( w.getLength() )
+                d->addWert( "SpielerFarbe", w.getText() );
+            w = tmp->zTeam()->farbe;
+            if( w.getLength() )
+                d->addWert( "TeamFarbe", w.getText() );
+            w = tmp->getSchadenBekommen();
+            if( w.getLength() )
+                d->addWert( "SchadenBekommen", w.getText() );
+            w = tmp->getSchadenGemacht();
+            if( w.getLength() )
+                d->addWert( "SchadenGemacht", w.getText() );
+            w = tmp->getTreibstoffVerbraucht();
+            if( w.getLength() )
+                d->addWert( "TreibstoffVerbraucht", w.getText() );
+            w = tmp->getShots();
+            if( w.getLength() )
+                d->addWert( "Schüsse", w.getText() );
+            w = tmp->getTreffer();
+            if( w.getLength() )
+                d->addWert( "Treffer", w.getText() );
+            w = tmp->getPunkte();
+            if( w.getLength() )
+                d->addWert( "Punkte", w.getText() );
+            w = tmp->getKills();
+            if( w.getLength() )
+                d->addWert( "Kills", w.getText() );
+            w = tmp->getTode();
+            if( w.getLength() )
+                d->addWert( "Tode", w.getText() );
+            w = tmp->getZeitAmLeben();
+            if( w.getLength() )
+                d->addWert( "ZeitAmLeben", w.getText() );
+            w = tmp->getZeitTod();
+            if( w.getLength() )
+                d->addWert( "ZeitTod", w.getText() );
+            SpielerStatistik *gss = new SpielerStatistik();
+            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->zTeam()->id )
+                {
+                    gefunden = 1;
+                    break;
+                }
+            }
+            if( gefunden )
+                continue;
+            InitDatei *d = new InitDatei();
+            Text w;
+            w = tmp->zTeam()->id;
+            if( w.getLength() )
+                d->addWert( "TeamNummer", w.getText() );
+            d->addWert( "TeamName", tmp->zTeam()->name );
+            w = tmp->zTeam()->farbe;
+            if( w.getLength() )
+                d->addWert( "TeamFarbe", w.getText() );
+            int schadenBekommen = 0;
+            int schadenGemacht = 0;
+            int treibstoffVerbraucht = 0;
+            int shots = 0;
+            int treffer = 0;
+            int punkte = 0;
+            int kills = 0;
+            int tode = 0;
+            for( int j = 0; j < spielerAnzahl; j++ )
+            {
+                Spieler *s = spieler->z( j );
+                if( s && s->zTeam()->id == tmp->zTeam()->id )
+                {
+                    schadenBekommen += s->getSchadenBekommen();
+                    schadenGemacht += s->getSchadenGemacht();
+                    treibstoffVerbraucht += s->getTreibstoffVerbraucht();
+                    shots += s->getShots();
+                    treffer += s->getTreffer();
+                    punkte += s->getPunkte();
+                    kills += s->getKills();
+                    tode += s->getTode();
+                }
+            }
+            w = schadenBekommen;
+            if( w.getLength() )
+                d->addWert( "SchadenBekommen", w.getText() );
+            w = schadenGemacht;
+            if( w.getLength() )
+                d->addWert( "SchadenGemacht", w.getText() );
+            w = treibstoffVerbraucht;
+            if( w.getLength() )
+                d->addWert( "TreibstoffVerbraucht", w.getText() );
+            w = shots;
+            if( w.getLength() )
+                d->addWert( "Schüsse", w.getText() );
+            w = treffer;
+            if( w.getLength() )
+                d->addWert( "Treffer", w.getText() );
+            w = punkte;
+            if( w.getLength() )
+                d->addWert( "Punkte", w.getText() );
+            w = kills;
+            if( w.getLength() )
+                d->addWert( "Kills", w.getText() );
+            w = tode;
+            if( w.getLength() )
+                d->addWert( "Tode", w.getText() );
+            w = (int)( gewinnerTeam == tmp->zTeam()->id );
+            if( w.getLength() )
+                d->addWert( "Gewonnen", w.getText() );
+            TeamStatistik *gts = new TeamStatistik();
+            gts->initValues( d );
+            this->gts->add( gts );
+        }
+    }
+    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;
+    }
 }

+ 27 - 31
Asteroids/Statistik.h

@@ -10,40 +10,36 @@
 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< SpielerStatistik > *gss;
-	RCArray< TeamStatistik > *gts;
-	RCArray< Text > *teamNamen;
-	int gewinnerTeam;
-	int ref;
+    int spielId;
+    int karteId;
+    SSDatenbankV *db;
+    int spielerAnzahl;
+    RCArray< Spieler > *spieler;
+    bool erstellt;
+    Array< bool > *sOnline;
+    Array< bool > *sBereit;
+    RCArray< SpielerStatistik > *gss;
+    RCArray< TeamStatistik > *gts;
+    RCArray< Text > *teamNamen;
+    int gewinnerTeam;
 
-	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 spielEnde( int team );
-	void setSpieler( int anzahl, RCArray< Spieler > *zSpieler );
-	virtual void klientOffline( int accountId );
-	virtual void statistikAnfrage( int accountId, short len, char *bytes );
-	virtual void run();
-	// 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 spielEnde( int team );
+    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

+ 7 - 13
Asteroids/StatistikKlasse.h

@@ -1,23 +1,17 @@
 #ifndef StatistikKlasse_H
 #define StatistikKlasse_H
 
-class StatistikV
+class StatistikV : public virtual 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

+ 111 - 171
Asteroids/Strukturen.cpp

@@ -6,8 +6,9 @@
 // Inhalt der RessourceStr Klasse aus Strukturen.h
 // Konstruktor
 RessourceStr::RessourceStr( Datei *zDatei, SSDatenbankV *zDb, char *tmpPfad, int kId )
+    : ReferenceCounter()
 {
-    zDatei->lese( (char *)& id, 4 );
+    zDatei->lese( (char *)&id, 4 );
     char len = 0;
     zDatei->lese( &len, 1 );
     Text txt;
@@ -32,12 +33,11 @@ RessourceStr::RessourceStr( Datei *zDatei, SSDatenbankV *zDb, char *tmpPfad, int
     if( pfad && pfad->hat( ".m2/" ) )
     {
         int pos = pfad->positionVon( ".m2/", pfad->anzahlVon( ".m2/" ) - 1 );
-        M2Datei * datei = new M2Datei( pfad->getTeilText( 0, pos + 3 ) );
+        M2Datei *datei = new M2Datei( pfad->getTeilText( 0, pos + 3 ) );
         datei->leseDaten();
         m2d = datei->ladeModel( pfad->getTeilText( pos + 4 ) );
         datei->release();
     }
-    ref = 1;
 }
 
 // Destruktor
@@ -67,204 +67,144 @@ Bild *RessourceStr::zReccourceTxt() const
     return bild;
 }
 
-// Reference Counting
-RessourceStr *RessourceStr::getThis()
-{
-    ref++;
-    return this;
-}
-
-RessourceStr *RessourceStr::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der ObjektStr Klasse aus Strukturen.h
 // Konstruktor
-ObjektStr::ObjektStr( Datei * zDatei )
+ObjektStr::ObjektStr( Datei *zDatei )
+    : ReferenceCounter()
 {
     if( zDatei )
     {
-        zDatei->lese( (char *)& pos.x, 4 );
-        zDatei->lese( (char *)& pos.y, 4 );
-        zDatei->lese( (char *)& rot, 4 );
-        zDatei->lese( (char *)& scale, 4 );
-        zDatei->lese( (char *)& id, 4 );
-        zDatei->lese( (char *)& m2d, 4 );
-        zDatei->lese( (char *)& bild, 4 );
-        zDatei->lese( (char *)& style, 4 );
-        zDatei->lese( (char *)& maxStability, 4 );
-        zDatei->lese( (char *)& maxEnergie, 4 );
-        zDatei->lese( (char *)& energieRadius, 4 );
-        zDatei->lese( (char *)& reparatur, 8 );
-        zDatei->lese( (char *)& akkuLeistung, 8 );
+        zDatei->lese( (char *)&pos.x, 4 );
+        zDatei->lese( (char *)&pos.y, 4 );
+        zDatei->lese( (char *)&rot, 4 );
+        zDatei->lese( (char *)&scale, 4 );
+        zDatei->lese( (char *)&id, 4 );
+        zDatei->lese( (char *)&m2d, 4 );
+        zDatei->lese( (char *)&bild, 4 );
+        zDatei->lese( (char *)&style, 4 );
+        zDatei->lese( (char *)&maxStability, 4 );
+        zDatei->lese( (char *)&maxEnergie, 4 );
+        zDatei->lese( (char *)&energieRadius, 4 );
+        zDatei->lese( (char *)&reparatur, 8 );
+        zDatei->lese( (char *)&akkuLeistung, 8 );
         zDatei->lese( &team, 1 );
     }
-    ref = 1;
 }
 
-void ObjektStr::save( Datei * zDatei ) const
+void ObjektStr::save( Datei *zDatei ) const
 {
-    zDatei->schreibe( (char *)& pos.x, 4 );
-    zDatei->schreibe( (char *)& pos.y, 4 );
-    zDatei->schreibe( (char *)& rot, 4 );
-    zDatei->schreibe( (char *)& scale, 4 );
-    zDatei->schreibe( (char *)& id, 4 );
-    zDatei->schreibe( (char *)& m2d, 4 );
-    zDatei->schreibe( (char *)& bild, 4 );
-    zDatei->schreibe( (char *)& style, 4 );
-    zDatei->schreibe( (char *)& maxStability, 4 );
-    zDatei->schreibe( (char *)& maxEnergie, 4 );
-    zDatei->schreibe( (char *)& energieRadius, 4 );
-    zDatei->schreibe( (char *)& reparatur, 8 );
-    zDatei->schreibe( (char *)& akkuLeistung, 8 );
-    zDatei->schreibe( (char *)& team, 1 );
-}
-
-// Reference Counting
-ObjektStr *ObjektStr::getThis()
-{
-    ref++;
-    return this;
-}
-
-ObjektStr *ObjektStr::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
+    zDatei->schreibe( (char *)&pos.x, 4 );
+    zDatei->schreibe( (char *)&pos.y, 4 );
+    zDatei->schreibe( (char *)&rot, 4 );
+    zDatei->schreibe( (char *)&scale, 4 );
+    zDatei->schreibe( (char *)&id, 4 );
+    zDatei->schreibe( (char *)&m2d, 4 );
+    zDatei->schreibe( (char *)&bild, 4 );
+    zDatei->schreibe( (char *)&style, 4 );
+    zDatei->schreibe( (char *)&maxStability, 4 );
+    zDatei->schreibe( (char *)&maxEnergie, 4 );
+    zDatei->schreibe( (char *)&energieRadius, 4 );
+    zDatei->schreibe( (char *)&reparatur, 8 );
+    zDatei->schreibe( (char *)&akkuLeistung, 8 );
+    zDatei->schreibe( (char *)&team, 1 );
 }
 
 
 // Inhalt der SpielerStr Klasse aus Strukturen.h
 // Konstruktor
-SpielerStr::SpielerStr( Datei * zDatei )
+SpielerStr::SpielerStr( Datei *zDatei )
+    : ReferenceCounter()
 {
     if( zDatei )
     {
-        zDatei->lese( (char *)& id, 4 );
-        zDatei->lese( (char *)& pos.x, 4 );
-        zDatei->lese( (char *)& pos.y, 4 );
-        zDatei->lese( (char *)& rot, 8 );
-        zDatei->lese( (char *)& beschleunigung, 8 );
-        zDatei->lese( (char *)& maxStability, 4 );
-        zDatei->lese( (char *)& maxEnergie, 4 );
-        zDatei->lese( (char *)& reparatur, 8 );
-        zDatei->lese( (char *)& akkuLeistung, 8 );
-        zDatei->lese( (char *)& laserIntensity, 4 );
-        zDatei->lese( (char *)& laserEffizienz, 4 );
-        zDatei->lese( (char *)& laserTempo, 4 );
-        zDatei->lese( (char *)& wendigkeit, 8 );
-        zDatei->lese( (char *)& antriebEffizienz, 8 );
-        zDatei->lese( (char *)& energieSchild, 8 );
-        zDatei->lese( (char *)& energieSchildEffizienz, 8 );
-        zDatei->lese( (char *)& netzwerk, 4 );
-        zDatei->lese( (char *)& skillPunkte, 4 );
-        zDatei->lese( (char *)& m2d, 4 );
-        zDatei->lese( (char *)& bild, 4 );
+        zDatei->lese( (char *)&id, 4 );
+        zDatei->lese( (char *)&pos.x, 4 );
+        zDatei->lese( (char *)&pos.y, 4 );
+        zDatei->lese( (char *)&rot, 8 );
+        zDatei->lese( (char *)&beschleunigung, 8 );
+        zDatei->lese( (char *)&maxStability, 4 );
+        zDatei->lese( (char *)&maxEnergie, 4 );
+        zDatei->lese( (char *)&reparatur, 8 );
+        zDatei->lese( (char *)&akkuLeistung, 8 );
+        zDatei->lese( (char *)&laserIntensity, 4 );
+        zDatei->lese( (char *)&laserEffizienz, 4 );
+        zDatei->lese( (char *)&laserTempo, 4 );
+        zDatei->lese( (char *)&wendigkeit, 8 );
+        zDatei->lese( (char *)&antriebEffizienz, 8 );
+        zDatei->lese( (char *)&energieSchild, 8 );
+        zDatei->lese( (char *)&energieSchildEffizienz, 8 );
+        zDatei->lese( (char *)&netzwerk, 4 );
+        zDatei->lese( (char *)&skillPunkte, 4 );
+        zDatei->lese( (char *)&m2d, 4 );
+        zDatei->lese( (char *)&bild, 4 );
     }
-    ref = 1;
-}
-
-void SpielerStr::save( Datei * zDatei ) const
-{
-    zDatei->schreibe( (char *)& id, 4 );
-    zDatei->schreibe( (char *)& pos.x, 4 );
-    zDatei->schreibe( (char *)& pos.y, 4 );
-    zDatei->schreibe( (char *)& rot, 8 );
-    zDatei->schreibe( (char *)& beschleunigung, 8 );
-    zDatei->schreibe( (char *)& maxStability, 4 );
-    zDatei->schreibe( (char *)& maxEnergie, 4 );
-    zDatei->schreibe( (char *)& reparatur, 8 );
-    zDatei->schreibe( (char *)& akkuLeistung, 8 );
-    zDatei->schreibe( (char *)& laserIntensity, 4 );
-    zDatei->schreibe( (char *)& laserEffizienz, 4 );
-    zDatei->schreibe( (char *)& laserTempo, 4 );
-    zDatei->schreibe( (char *)& wendigkeit, 8 );
-    zDatei->schreibe( (char *)& antriebEffizienz, 8 );
-    zDatei->schreibe( (char *)& energieSchild, 8 );
-    zDatei->schreibe( (char *)& energieSchildEffizienz, 8 );
-    zDatei->schreibe( (char *)& netzwerk, 4 );
-    zDatei->schreibe( (char *)& skillPunkte, 4 );
-    zDatei->schreibe( (char *)& m2d, 4 );
-    zDatei->schreibe( (char *)& bild, 4 );
 }
 
-// Reference Counting
-SpielerStr *SpielerStr::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpielerStr *SpielerStr::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
+void SpielerStr::save( Datei *zDatei ) const
+{
+    zDatei->schreibe( (char *)&id, 4 );
+    zDatei->schreibe( (char *)&pos.x, 4 );
+    zDatei->schreibe( (char *)&pos.y, 4 );
+    zDatei->schreibe( (char *)&rot, 8 );
+    zDatei->schreibe( (char *)&beschleunigung, 8 );
+    zDatei->schreibe( (char *)&maxStability, 4 );
+    zDatei->schreibe( (char *)&maxEnergie, 4 );
+    zDatei->schreibe( (char *)&reparatur, 8 );
+    zDatei->schreibe( (char *)&akkuLeistung, 8 );
+    zDatei->schreibe( (char *)&laserIntensity, 4 );
+    zDatei->schreibe( (char *)&laserEffizienz, 4 );
+    zDatei->schreibe( (char *)&laserTempo, 4 );
+    zDatei->schreibe( (char *)&wendigkeit, 8 );
+    zDatei->schreibe( (char *)&antriebEffizienz, 8 );
+    zDatei->schreibe( (char *)&energieSchild, 8 );
+    zDatei->schreibe( (char *)&energieSchildEffizienz, 8 );
+    zDatei->schreibe( (char *)&netzwerk, 4 );
+    zDatei->schreibe( (char *)&skillPunkte, 4 );
+    zDatei->schreibe( (char *)&m2d, 4 );
+    zDatei->schreibe( (char *)&bild, 4 );
 }
 
 // Inhalt der TeamStr Klasse aus Strukturen.h
 // Konstruktor
-TeamStr::TeamStr( Datei * zDatei )
+TeamStr::TeamStr( Datei *zDatei )
+    : ReferenceCounter()
 {
     if( zDatei )
     {
-        zDatei->lese( (char *)& id, 4 );
-        zDatei->lese( (char *)& maxPunkte, 4 );
-        zDatei->lese( (char *)& beschleunigung, 8 );
-        zDatei->lese( (char *)& maxStability, 4 );
-        zDatei->lese( (char *)& maxEnergie, 4 );
-        zDatei->lese( (char *)& reparatur, 8 );
-        zDatei->lese( (char *)& akkuLeistung, 8 );
-        zDatei->lese( (char *)& laserIntensity, 4 );
-        zDatei->lese( (char *)& laserEffizienz, 4 );
-        zDatei->lese( (char *)& laserTempo, 4 );
-        zDatei->lese( (char *)& wendigkeit, 8 );
-        zDatei->lese( (char *)& antriebEffizienz, 8 );
-        zDatei->lese( (char *)& energieSchild, 8 );
-        zDatei->lese( (char *)& energieSchildEffizienz, 8 );
-        zDatei->lese( (char *)& punkte, 4 );
+        zDatei->lese( (char *)&id, 4 );
+        zDatei->lese( (char *)&maxPunkte, 4 );
+        zDatei->lese( (char *)&beschleunigung, 8 );
+        zDatei->lese( (char *)&maxStability, 4 );
+        zDatei->lese( (char *)&maxEnergie, 4 );
+        zDatei->lese( (char *)&reparatur, 8 );
+        zDatei->lese( (char *)&akkuLeistung, 8 );
+        zDatei->lese( (char *)&laserIntensity, 4 );
+        zDatei->lese( (char *)&laserEffizienz, 4 );
+        zDatei->lese( (char *)&laserTempo, 4 );
+        zDatei->lese( (char *)&wendigkeit, 8 );
+        zDatei->lese( (char *)&antriebEffizienz, 8 );
+        zDatei->lese( (char *)&energieSchild, 8 );
+        zDatei->lese( (char *)&energieSchildEffizienz, 8 );
+        zDatei->lese( (char *)&punkte, 4 );
     }
-    ref = 1;
 }
 
-void TeamStr::save( Datei * zDatei ) const
-{
-    zDatei->schreibe( (char *)& id, 4 );
-    zDatei->schreibe( (char *)& maxPunkte, 4 );
-    zDatei->schreibe( (char *)& beschleunigung, 8 );
-    zDatei->schreibe( (char *)& maxStability, 4 );
-    zDatei->schreibe( (char *)& maxEnergie, 4 );
-    zDatei->schreibe( (char *)& reparatur, 8 );
-    zDatei->schreibe( (char *)& akkuLeistung, 8 );
-    zDatei->schreibe( (char *)& laserIntensity, 4 );
-    zDatei->schreibe( (char *)& laserEffizienz, 4 );
-    zDatei->schreibe( (char *)& laserTempo, 4 );
-    zDatei->schreibe( (char *)& wendigkeit, 8 );
-    zDatei->schreibe( (char *)& antriebEffizienz, 8 );
-    zDatei->schreibe( (char *)& energieSchild, 8 );
-    zDatei->schreibe( (char *)& energieSchildEffizienz, 8 );
-    zDatei->schreibe( (char *)& punkte, 4 );
-}
-
-// Reference Counting
-TeamStr *TeamStr::getThis()
-{
-    ref++;
-    return this;
-}
-
-TeamStr *TeamStr::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
+void TeamStr::save( Datei *zDatei ) const
+{
+    zDatei->schreibe( (char *)&id, 4 );
+    zDatei->schreibe( (char *)&maxPunkte, 4 );
+    zDatei->schreibe( (char *)&beschleunigung, 8 );
+    zDatei->schreibe( (char *)&maxStability, 4 );
+    zDatei->schreibe( (char *)&maxEnergie, 4 );
+    zDatei->schreibe( (char *)&reparatur, 8 );
+    zDatei->schreibe( (char *)&akkuLeistung, 8 );
+    zDatei->schreibe( (char *)&laserIntensity, 4 );
+    zDatei->schreibe( (char *)&laserEffizienz, 4 );
+    zDatei->schreibe( (char *)&laserTempo, 4 );
+    zDatei->schreibe( (char *)&wendigkeit, 8 );
+    zDatei->schreibe( (char *)&antriebEffizienz, 8 );
+    zDatei->schreibe( (char *)&energieSchild, 8 );
+    zDatei->schreibe( (char *)&energieSchildEffizienz, 8 );
+    zDatei->schreibe( (char *)&punkte, 4 );
 }

+ 60 - 82
Asteroids/Strukturen.h

@@ -8,119 +8,97 @@
 
 using namespace Framework;
 
-class RessourceStr
+class RessourceStr : public virtual ReferenceCounter
 {
 private:
-	int id;
-	int ref;
-	Model2DData *m2d;
-	Bild *bild;
-	Text *pfad;
+    int id;
+    Model2DData *m2d;
+    Bild *bild;
+    Text *pfad;
 
 public:
-	// Konstruktor
+    // Konstruktor
     RessourceStr( Datei *zDatei, SSDatenbankV *zDb, char *tmpPfad, int kId );
-	// Destruktor
-	~RessourceStr();
-	// constant
-	int getId() const;
-	Model2DData *zReccourceM2() const;
-	Bild *zReccourceTxt() const;
-	// Reference Counting
-	RessourceStr *getThis();
-	RessourceStr *release();
+    // Destruktor
+    ~RessourceStr();
+    // constant
+    int getId() const;
+    Model2DData *zReccourceM2() const;
+    Bild *zReccourceTxt() const;
 };
 
-class ObjektStr
+class ObjektStr : public virtual ReferenceCounter
 {
-private:
-	int ref;
-
 public:
-	Punkt pos;
+    Punkt pos;
     float rot;
     float scale;
-	int id;
-	int m2d;
-	int bild;
-	int style;
-	int maxStability;
-	int maxEnergie;
-	int energieRadius;
-	double reparatur;
-	double akkuLeistung;
-	char team;
+    int id;
+    int m2d;
+    int bild;
+    int style;
+    int maxStability;
+    int maxEnergie;
+    int energieRadius;
+    double reparatur;
+    double akkuLeistung;
+    char team;
 
-	// Konstruktor
-	ObjektStr( Datei *zDatei );
+    // Konstruktor
+    ObjektStr( Datei *zDatei );
     void save( Datei *zDatei ) const;
-	// Reference Counting
-	ObjektStr *getThis();
-	ObjektStr *release();
 };
 
-class SpielerStr
+class SpielerStr : public virtual ReferenceCounter
 {
-private:
-	int ref;
-
 public:
-	int id;
-	Punkt pos;
-	double rot;
-	double beschleunigung;
-	int maxStability;
-	int maxEnergie;
-	double reparatur;
-	double akkuLeistung;
-	int laserIntensity;
-	int laserEffizienz;
-	int laserTempo;
-	double wendigkeit;
+    int id;
+    Punkt pos;
+    double rot;
+    double beschleunigung;
+    int maxStability;
+    int maxEnergie;
+    double reparatur;
+    double akkuLeistung;
+    int laserIntensity;
+    int laserEffizienz;
+    int laserTempo;
+    double wendigkeit;
     double antriebEffizienz;
     double energieSchild;
     double energieSchildEffizienz;
-	int netzwerk;
-	int skillPunkte;
-	int m2d;
-	int bild;
+    int netzwerk;
+    int skillPunkte;
+    int m2d;
+    int bild;
 
-	// Konstruktor
-	SpielerStr( Datei *zDatei );
+    // Konstruktor
+    SpielerStr( Datei *zDatei );
     void save( Datei *zDatei ) const;
-	// Reference Counting
-	SpielerStr *getThis();
-	SpielerStr *release();
 };
 
-class TeamStr
+class TeamStr : public virtual ReferenceCounter
 {
-private:
-	int ref;
-
 public:
-	int id;
-	int maxPunkte;
-	double beschleunigung;
-	int maxStability;
-	int maxEnergie;
-	double reparatur;
-	double akkuLeistung;
-	int laserIntensity;
-	int laserEffizienz;
-	int laserTempo;
-	double wendigkeit;
+    int id;
+    int maxPunkte;
+    double beschleunigung;
+    int maxStability;
+    int maxEnergie;
+    double reparatur;
+    double akkuLeistung;
+    int laserIntensity;
+    int laserEffizienz;
+    int laserTempo;
+    double wendigkeit;
     double antriebEffizienz;
     double energieSchild;
     double energieSchildEffizienz;
-	int punkte;
+    int punkte;
 
-	// Konstruktor
-	TeamStr( Datei *zDatei );
+    // Konstruktor
+    TeamStr( Datei *zDatei );
     void save( Datei *zDatei ) const;
-	// Reference Counting
-	TeamStr *getThis();
-	TeamStr *release();
 };
 
 #endif

+ 57 - 72
Asteroids/Team.cpp

@@ -3,48 +3,48 @@
 // Inhalt der Team Klasse aus Team.h
 // Konstruktor
 Team::Team( int f, char *n, TeamStr *zStr )
-{
-	id = zStr->id;
-	farbe = f;
-	name = n;
-	spieler = new RCArray< Spieler >();
-	punkte = zStr->punkte;
-	maxPunkte = zStr->maxPunkte;
-	maxEnergieS = zStr->maxEnergie;
-	maxStabilityS = zStr->maxStability;
-	reparaturS = zStr->reparatur;
-	laserIntensityS = zStr->laserIntensity;
-	laserEffizienzS = zStr->laserEffizienz;
-	akkuLeistungS = zStr->akkuLeistung;
-	laserTempoS = zStr->laserTempo;
-	beschleunigungS = zStr->beschleunigung;
-	wendigkeitS = zStr->wendigkeit;
+    : ReferenceCounter()
+{
+    id = zStr->id;
+    farbe = f;
+    name = n;
+    spieler = new RCArray< Spieler >();
+    punkte = zStr->punkte;
+    maxPunkte = zStr->maxPunkte;
+    maxEnergieS = zStr->maxEnergie;
+    maxStabilityS = zStr->maxStability;
+    reparaturS = zStr->reparatur;
+    laserIntensityS = zStr->laserIntensity;
+    laserEffizienzS = zStr->laserEffizienz;
+    akkuLeistungS = zStr->akkuLeistung;
+    laserTempoS = zStr->laserTempo;
+    beschleunigungS = zStr->beschleunigung;
+    wendigkeitS = zStr->wendigkeit;
     antriebEffizienzS = zStr->antriebEffizienz;
     energieSchildS = zStr->energieSchild;
     energieSchildEffizienzS = zStr->energieSchildEffizienz;
-	reset();
-	ref = 1;
+    reset();
 }
 
 // Destruktor
 Team::~Team()
 {
-	spieler->release();
+    spieler->release();
 }
 
 // nicht constant
 void Team::reset()
 {
-	spieler->leeren();
-	maxEnergie = maxEnergieS;
-	maxStability = maxStabilityS;
-	reparatur = reparaturS;
-	laserIntensity = laserIntensityS;
-	laserEffizienz = laserEffizienzS;
-	akkuLeistung = akkuLeistungS;
-	laserTempo = laserTempoS;
-	beschleunigung = beschleunigungS;
-	wendigkeit = wendigkeitS;
+    spieler->leeren();
+    maxEnergie = maxEnergieS;
+    maxStability = maxStabilityS;
+    reparatur = reparaturS;
+    laserIntensity = laserIntensityS;
+    laserEffizienz = laserEffizienzS;
+    akkuLeistung = akkuLeistungS;
+    laserTempo = laserTempoS;
+    beschleunigung = beschleunigungS;
+    wendigkeit = wendigkeitS;
     antriebEffizienz = antriebEffizienzS;
     energieSchild = energieSchildS;
     energieSchildEffizienz = energieSchildEffizienzS;
@@ -53,74 +53,74 @@ void Team::reset()
 // constant
 double Team::getMaxEnergieBonus() const
 {
-	double ret = maxEnergieS;
-	for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamMaxEnergieBonus();
-	return ret;
+    double ret = maxEnergieS;
+    for( auto i = spieler->getIterator(); i; i++ )
+        ret += i->getTeamMaxEnergieBonus();
+    return ret;
 }
 
 double Team::getMaxStabilityBonus() const
 {
-	double ret = maxStabilityS;
+    double ret = maxStabilityS;
     for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamMaxStabilityBonus();
-	return ret;
+        ret += i->getTeamMaxStabilityBonus();
+    return ret;
 }
 
 double Team::getReperaturBonus() const
 {
-	double ret = reparaturS;
+    double ret = reparaturS;
     for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamReparaturBonus();
-	return ret;
+        ret += i->getTeamReparaturBonus();
+    return ret;
 }
 
 double Team::getLaserIntensityBonus() const
 {
-	double ret = laserIntensityS;
+    double ret = laserIntensityS;
     for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamLaserIntensityBonus();
-	return ret;
+        ret += i->getTeamLaserIntensityBonus();
+    return ret;
 }
 
 double Team::getLaserEffizienzBonus() const
 {
-	double ret = laserEffizienzS;
+    double ret = laserEffizienzS;
     for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamLaserEffizienzBonus();
-	return ret;
+        ret += i->getTeamLaserEffizienzBonus();
+    return ret;
 }
 
 double Team::getAkkuLeistungBonus() const
 {
-	double ret = akkuLeistungS;
+    double ret = akkuLeistungS;
     for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamAkkuLeistungBonus();
-	return ret;
+        ret += i->getTeamAkkuLeistungBonus();
+    return ret;
 }
 
 double Team::getLaserTempoBonus() const
 {
-	double ret = laserTempoS;
+    double ret = laserTempoS;
     for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamLaserTempoBonus();
-	return ret;
+        ret += i->getTeamLaserTempoBonus();
+    return ret;
 }
 
 double Team::getBeschleunigungBonus() const
 {
-	double ret = beschleunigungS;
+    double ret = beschleunigungS;
     for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamBeschleunigungBonus();
-	return ret;
+        ret += i->getTeamBeschleunigungBonus();
+    return ret;
 }
 
 double Team::getWendigkeitBonus() const
 {
-	double ret = wendigkeitS;
+    double ret = wendigkeitS;
     for( auto i = spieler->getIterator(); i; i++ )
-		ret += i->getTeamWendigkeitBonus();
-	return ret;
+        ret += i->getTeamWendigkeitBonus();
+    return ret;
 }
 
 double Team::getAntriebEffizienzBonus() const
@@ -145,19 +145,4 @@ double Team::getEnergieSchildEffizienzBonus() const
     for( auto i = spieler->getIterator(); i; i++ )
         ret += i->getTeamEnergieSchildEffizienzBonus();
     return ret;
-}
-
-// Reference Counting
-Team *Team::getThis()
-{
-	ref++;
-	return this;
-}
-
-Team *Team::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
 }

+ 42 - 46
Asteroids/Team.h

@@ -5,65 +5,61 @@
 #include "Spieler.h"
 #include "Strukturen.h"
 
-class Team
+class Team : public virtual ReferenceCounter
 {
 private:
-	double maxEnergieS;
-	double maxStabilityS;
-	double reparaturS;
-	double laserIntensityS;
-	double laserEffizienzS;
-	double akkuLeistungS;
-	double laserTempoS;
-	double beschleunigungS;
-	double wendigkeitS;
+    double maxEnergieS;
+    double maxStabilityS;
+    double reparaturS;
+    double laserIntensityS;
+    double laserEffizienzS;
+    double akkuLeistungS;
+    double laserTempoS;
+    double beschleunigungS;
+    double wendigkeitS;
     double antriebEffizienzS;
     double energieSchildS;
     double energieSchildEffizienzS;
-	int ref;
 
 public:
-	// variablen
-	int id;
-	int farbe;
-	Text name;
-	RCArray< Spieler > *spieler;
-	int punkte;
-	int maxPunkte;
-	double maxEnergie;
-	double maxStability;
-	double reparatur;
-	double laserIntensity;
-	double laserEffizienz;
-	double akkuLeistung;
-	double laserTempo;
-	double beschleunigung;
-	double wendigkeit;
+    // variablen
+    int id;
+    int farbe;
+    Text name;
+    RCArray< Spieler > *spieler;
+    int punkte;
+    int maxPunkte;
+    double maxEnergie;
+    double maxStability;
+    double reparatur;
+    double laserIntensity;
+    double laserEffizienz;
+    double akkuLeistung;
+    double laserTempo;
+    double beschleunigung;
+    double wendigkeit;
     double antriebEffizienz;
     double energieSchild;
     double energieSchildEffizienz;
-	// Konstruktor
-	Team( int f, char *n, TeamStr *zStr );
-	// Destruktor
-	~Team();
-	// nicht constant
-	void reset();
-	// constant
-	double getMaxEnergieBonus() const;
-	double getMaxStabilityBonus() const;
-	double getReperaturBonus() const;
-	double getLaserIntensityBonus() const;
-	double getLaserEffizienzBonus() const;
-	double getAkkuLeistungBonus() const;
-	double getLaserTempoBonus() const;
-	double getBeschleunigungBonus() const;
-	double getWendigkeitBonus() const;
+    // Konstruktor
+    Team( int f, char *n, TeamStr *zStr );
+    // Destruktor
+    ~Team();
+    // nicht constant
+    void reset();
+    // constant
+    double getMaxEnergieBonus() const;
+    double getMaxStabilityBonus() const;
+    double getReperaturBonus() const;
+    double getLaserIntensityBonus() const;
+    double getLaserEffizienzBonus() const;
+    double getAkkuLeistungBonus() const;
+    double getLaserTempoBonus() const;
+    double getBeschleunigungBonus() const;
+    double getWendigkeitBonus() const;
     double getAntriebEffizienzBonus() const;
     double getEnergieSchildBonus() const;
     double getEnergieSchildEffizienzBonus() const;
-	// Reference Counting
-	Team *getThis();
-	Team *release();
 };
 
 #endif

+ 53 - 68
Asteroids/TeamStatistik.cpp

@@ -3,135 +3,120 @@
 // Inhalt der TeamStatistik Klasse aus TeamStatistik.h
 // Konstruktor
 TeamStatistik::TeamStatistik()
-{
-	teamNummer = 0;
-	teamName = new Text();
-	teamFarbe = 0;
-	schadenBekommen = 0;
-	schadenGemacht = 0;
-	treibstoffVerbraucht = 0;
-	shots = 0;
-	treffer = 0;
-	punkte = 0;
-	kills = 0;
-	tode = 0;
-	gewonnen = 0;
-	ref = 1;
+    : ReferenceCounter()
+{
+    teamNummer = 0;
+    teamName = new Text();
+    teamFarbe = 0;
+    schadenBekommen = 0;
+    schadenGemacht = 0;
+    treibstoffVerbraucht = 0;
+    shots = 0;
+    treffer = 0;
+    punkte = 0;
+    kills = 0;
+    tode = 0;
+    gewonnen = 0;
 }
 
 // Destruktor
 TeamStatistik::~TeamStatistik()
 {
-	teamName->release();
+    teamName->release();
 }
 
 // nicht constant
 void TeamStatistik::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( "SchadenBekommen" ) )
-		schadenBekommen = *dat->zWert( "SchadenBekommen" );
-	if( dat->wertExistiert( "SchadenGemacht" ) )
-		schadenGemacht = *dat->zWert( "SchadenGemacht" );
-	if( dat->wertExistiert( "TreibstoffVerbraucht" ) )
-		treibstoffVerbraucht = *dat->zWert( "TreibstoffVerbraucht" );
-	if( dat->wertExistiert( "Schüsse" ) )
-		shots = *dat->zWert( "Schüsse" );
-	if( dat->wertExistiert( "Treffer" ) )
-		treffer = *dat->zWert( "Treffer" );
-	if( dat->wertExistiert( "Punkte" ) )
-		punkte = *dat->zWert( "Punkte" );
-	if( dat->wertExistiert( "Kills" ) )
-		kills = *dat->zWert( "Kills" );
-	if( dat->wertExistiert( "Tode" ) )
-		tode = *dat->zWert( "Tode" );
-	if( dat->wertExistiert( "Gewonnen" ) )
-		gewonnen = (int)*dat->zWert( "Tode" ) != 0;
-	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( "SchadenBekommen" ) )
+        schadenBekommen = *dat->zWert( "SchadenBekommen" );
+    if( dat->wertExistiert( "SchadenGemacht" ) )
+        schadenGemacht = *dat->zWert( "SchadenGemacht" );
+    if( dat->wertExistiert( "TreibstoffVerbraucht" ) )
+        treibstoffVerbraucht = *dat->zWert( "TreibstoffVerbraucht" );
+    if( dat->wertExistiert( "Schüsse" ) )
+        shots = *dat->zWert( "Schüsse" );
+    if( dat->wertExistiert( "Treffer" ) )
+        treffer = *dat->zWert( "Treffer" );
+    if( dat->wertExistiert( "Punkte" ) )
+        punkte = *dat->zWert( "Punkte" );
+    if( dat->wertExistiert( "Kills" ) )
+        kills = *dat->zWert( "Kills" );
+    if( dat->wertExistiert( "Tode" ) )
+        tode = *dat->zWert( "Tode" );
+    if( dat->wertExistiert( "Gewonnen" ) )
+        gewonnen = (int)*dat->zWert( "Tode" ) != 0;
+    dat->release();
 }
 
 // constant
 int TeamStatistik::getTeamNummer() const
 {
-	return teamNummer;
+    return teamNummer;
 }
 
 Text *TeamStatistik::getTeamName() const
 {
-	return teamName ? teamName->getThis() : 0;
+    return teamName ? dynamic_cast<Text *>( teamName->getThis() ) : 0;
 }
 
 Text *TeamStatistik::zTeamName() const
 {
-	return teamName;
+    return teamName;
 }
 
 int TeamStatistik::getTeamFarbe() const
 {
-	return teamFarbe;
+    return teamFarbe;
 }
 
 int TeamStatistik::getSchadenBekommen() const
 {
-	return schadenBekommen;
+    return schadenBekommen;
 }
 
 int TeamStatistik::getSchadenGemacht() const
 {
-	return schadenGemacht;
+    return schadenGemacht;
 }
 
 int TeamStatistik::getTreibstoffVerbraucht() const
 {
-	return treibstoffVerbraucht;
+    return treibstoffVerbraucht;
 }
 
 int TeamStatistik::getShots() const
 {
-	return shots;
+    return shots;
 }
 
 int TeamStatistik::getTreffer() const
 {
-	return treffer;
+    return treffer;
 }
 
 int TeamStatistik::getPunkte() const
 {
-	return punkte;
+    return punkte;
 }
 
 int TeamStatistik::getKills() const
 {
-	return kills;
+    return kills;
 }
 
 int TeamStatistik::getTode() const
 {
-	return tode;
+    return tode;
 }
 
 bool TeamStatistik::hatGewonnen() const
 {
-	return gewonnen;
-}
-
-// Reference Counting
-TeamStatistik *TeamStatistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-TeamStatistik *TeamStatistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return gewonnen;
 }

+ 33 - 37
Asteroids/TeamStatistik.h

@@ -6,47 +6,43 @@
 
 using namespace Framework;
 
-class TeamStatistik
+class TeamStatistik : public virtual ReferenceCounter
 {
 private:
-	int teamNummer;
-	Text *teamName;
-	int teamFarbe;
-	int schadenBekommen;
-	int schadenGemacht;
-	int treibstoffVerbraucht;
-	int shots;
-	int treffer;
-	int punkte;
-	int kills;
-	int tode;
-	bool gewonnen;
-	int ref;
+    int teamNummer;
+    Text *teamName;
+    int teamFarbe;
+    int schadenBekommen;
+    int schadenGemacht;
+    int treibstoffVerbraucht;
+    int shots;
+    int treffer;
+    int punkte;
+    int kills;
+    int tode;
+    bool gewonnen;
 
 public:
-	// Konstruktor
-	TeamStatistik();
-	// Destruktor
-	~TeamStatistik();
-	// nicht constant
-	void initValues( InitDatei *dat );
-	// constant
-	int getTeamNummer() const;
-	Text *getTeamName() const;
-	Text *zTeamName() const;
-	int getTeamFarbe() const;
-	int getSchadenBekommen() const;
-	int getSchadenGemacht() const;
-	int getTreibstoffVerbraucht() const;
-	int getShots() const;
-	int getTreffer() const;
-	int getPunkte() const;
-	int getKills() const;
-	int getTode() const;
-	bool hatGewonnen() const;
-	// Reference Counting
-	TeamStatistik *getThis();
-	TeamStatistik *release();
+    // Konstruktor
+    TeamStatistik();
+    // Destruktor
+    ~TeamStatistik();
+    // nicht constant
+    void initValues( InitDatei *dat );
+    // constant
+    int getTeamNummer() const;
+    Text *getTeamName() const;
+    Text *zTeamName() const;
+    int getTeamFarbe() const;
+    int getSchadenBekommen() const;
+    int getSchadenGemacht() const;
+    int getTreibstoffVerbraucht() const;
+    int getShots() const;
+    int getTreffer() const;
+    int getPunkte() const;
+    int getKills() const;
+    int getTode() const;
+    bool hatGewonnen() const;
 };
 
 #endif