소스 검색

Fehler beim beenden von Threads behoben

Kolja Strohm 5 년 전
부모
커밋
f2f78d0642
40개의 변경된 파일1041개의 추가작업 그리고 829개의 파일을 삭제
  1. 11 5
      KSGClient/NachLogin/Account/Aktivität/AccountAktivität.cpp
  2. 2 0
      KSGClient/NachLogin/Account/Aktivität/AccountAktivität.h
  3. 16 0
      KSGClient/NachLogin/Account/Historie/AccountHistorie.cpp
  4. 4 0
      KSGClient/NachLogin/Account/Historie/AccountHistorie.h
  5. 12 4
      KSGClient/NachLogin/Account/Suchen/AccountSuchen.cpp
  6. 2 0
      KSGClient/NachLogin/Account/Suchen/AccountSuchen.h
  7. 8 1
      KSGClient/NachLogin/Chat/FreundesListe.cpp
  8. 2 0
      KSGClient/NachLogin/Chat/FreundesListe.h
  9. 12 4
      KSGClient/NachLogin/Editor/Auswahl/Auswahl.cpp
  10. 2 0
      KSGClient/NachLogin/Editor/Auswahl/Auswahl.h
  11. 12 6
      KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBeschreibung.cpp
  12. 2 0
      KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBeschreibung.h
  13. 12 6
      KSGClient/NachLogin/Editor/Karte/Dateien/KEDateien.cpp
  14. 2 0
      KSGClient/NachLogin/Editor/Karte/Dateien/KEDateien.h
  15. 13 6
      KSGClient/NachLogin/Editor/Karte/KarteRelease/KERelease.cpp
  16. 2 0
      KSGClient/NachLogin/Editor/Karte/KarteRelease/KERelease.h
  17. 12 6
      KSGClient/NachLogin/Editor/Karte/KartenEditor.cpp
  18. 2 0
      KSGClient/NachLogin/Editor/Karte/KartenEditor.h
  19. 12 6
      KSGClient/NachLogin/Editor/Karte/KaufHistorie/KaufHistorie.cpp
  20. 2 0
      KSGClient/NachLogin/Editor/Karte/KaufHistorie/KaufHistorie.h
  21. 12 6
      KSGClient/NachLogin/Editor/Karte/ShopSeite/KEShopSeite.cpp
  22. 2 0
      KSGClient/NachLogin/Editor/Karte/ShopSeite/KEShopSeite.h
  23. 12 6
      KSGClient/NachLogin/Editor/Karte/Teams/KETeams.cpp
  24. 2 0
      KSGClient/NachLogin/Editor/Karte/Teams/KETeams.h
  25. 8 1
      KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.cpp
  26. 2 0
      KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.h
  27. 24 8
      KSGClient/NachLogin/Shop/Karten/KartenKaufen.cpp
  28. 4 0
      KSGClient/NachLogin/Shop/Karten/KartenKaufen.h
  29. 760 744
      KSGClient/NachLogin/Shop/Spiele/SpieleKaufen.cpp
  30. 4 0
      KSGClient/NachLogin/Shop/Spiele/SpieleKaufen.h
  31. 13 4
      KSGClient/NachLogin/Spiele/Gruppe/Gruppe.cpp
  32. 2 0
      KSGClient/NachLogin/Spiele/Gruppe/Gruppe.h
  33. 11 0
      KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.cpp
  34. 2 0
      KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.h
  35. 11 5
      KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.cpp
  36. 2 0
      KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.h
  37. 8 1
      KSGClient/NachLogin/Titel/TitelLeiste.cpp
  38. 2 0
      KSGClient/NachLogin/Titel/TitelLeiste.h
  39. 16 10
      KSGClient/NachLogin/Update/Update.cpp
  40. 2 0
      KSGClient/NachLogin/Update/Update.h

+ 11 - 5
KSGClient/NachLogin/Account/Aktivität/AccountAktivität.cpp

@@ -39,11 +39,6 @@ AccountAktivit
 // Destruktor
 AccountAktivität::~AccountAktivität()
 {
-	if( run )
-	{
-		warteAufThread( 1000 );
-		ende();
-	}
 	aktivitätF->release();
 	online->release();
 	spiele->release();
@@ -294,4 +289,15 @@ void AccountAktivit
 int AccountAktivität::getStatus() const
 {
     return status;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *AccountAktivität::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 1000 );
+        ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Account/Aktivität/AccountAktivität.h

@@ -35,6 +35,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	int getStatus() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 16 - 0
KSGClient/NachLogin/Account/Historie/AccountHistorie.cpp

@@ -251,6 +251,14 @@ bool AHSpielStatistik::istNochSichtbar() const
 	return statistik ? statistik->istNochSichtbar() : 0;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *AHSpielStatistik::release()
+{
+    if( ref == 2 && run )
+        warteAufThread( INFINITE );
+    return Thread::release();
+}
+
 
 // Inahlt der AHSpielVideo Klasse aus AccountHistorie.h
 // Konstruktor
@@ -454,6 +462,14 @@ bool AHSpielVideo::istNochSichtbar() const
 	return alpha != 0;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *AHSpielVideo::release()
+{
+    if( ref == 2 && run )
+        warteAufThread( INFINITE );
+    return Thread::release();
+}
+
 
 // Inhalt der AHSLETeamListeSpieler Klasse aus AccountHistorie.h
 // Konstruktor

+ 4 - 0
KSGClient/NachLogin/Account/Historie/AccountHistorie.h

@@ -45,6 +45,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	bool istNochSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class AHSpielVideo : public Thread
@@ -75,6 +77,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	bool istNochSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class AHSLETeamListeSpieler

+ 12 - 4
KSGClient/NachLogin/Account/Suchen/AccountSuchen.cpp

@@ -48,10 +48,6 @@ AccountSuchen::AccountSuchen( Schrift *schrift )
 // Destruktor
 AccountSuchen::~AccountSuchen()
 {
-	if( run )
-		warteAufThread( 1000 );
-	if( run )
-		ende();
 	schrift->release();
 	laden->release();
 	accountName->release();
@@ -297,6 +293,18 @@ int AccountSuchen::getAuswahlAccountId()
 	return ret;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *AccountSuchen::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 1000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
+}
+
 // Nachrichten
 bool accountSuchenDetailsKlick( void *p, void *obj, MausEreignis me )
 {

+ 2 - 0
KSGClient/NachLogin/Account/Suchen/AccountSuchen.h

@@ -51,6 +51,8 @@ public:
 	bool tick( double tickVal );
 	void render( Bild &zRObj );
 	int getAuswahlAccountId();
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 // Nachrichten

+ 8 - 1
KSGClient/NachLogin/Chat/FreundesListe.cpp

@@ -718,7 +718,6 @@ FreundesListe::FreundesListe( Schrift * zSchrift, Fenster * zNachLoginFenster )
 // Destruktor
 FreundesListe::~FreundesListe()
 {
-    ende();
     fenster = (Fenster *)fenster->release();
     minimierenBild = minimierenBild->release();
     maximierenBild = maximierenBild->release();
@@ -1100,6 +1099,14 @@ bool FreundesListe::druckNeuesChatroomFertig( MausEreignis & me )
     return 1;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *FreundesListe::release()
+{
+    if( ref == 2 && run )
+        ende();
+    return Thread::release();
+}
+
 // constant
 bool FreundesListe::istFreund( int accId ) const
 {

+ 2 - 0
KSGClient/NachLogin/Chat/FreundesListe.h

@@ -148,6 +148,8 @@ public:
 	bool druckNeuesChatroomFertig( MausEreignis &me );
 	// constant
 	bool istFreund( int accId ) const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 // Nachrichten

+ 12 - 4
KSGClient/NachLogin/Editor/Auswahl/Auswahl.cpp

@@ -38,10 +38,6 @@ Auswahl::Auswahl( Schrift *zSchrift, KartenEditor *kEditor )
 // Destruktor
 Auswahl::~Auswahl()
 {
-    if( run )
-        warteAufThread( 1000 );
-    if( run )
-        ende();
     laden->release();
     suchFilterT->release();
     suchFilter->release();
@@ -379,6 +375,18 @@ bool Auswahl::istSichtbar() const
     return sichtbar;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *Auswahl::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 1000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
+}
+
 
 // Ereignisse
 bool auswahlWeiterME( void *p, void *obj, MausEreignis me )

+ 2 - 0
KSGClient/NachLogin/Editor/Auswahl/Auswahl.h

@@ -46,6 +46,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 // Ereignisse

+ 12 - 6
KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBeschreibung.cpp

@@ -45,12 +45,6 @@ KEBeschreibung::KEBeschreibung( int karte, Schrift *zSchrift )
 // Destruktor
 KEBeschreibung::~KEBeschreibung()
 {
-    if( run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
     fenster->release();
     laden->release();
     schrift->release();
@@ -409,4 +403,16 @@ void KEBeschreibung::render( Bild &zRObj )
 bool KEBeschreibung::istSichtbar() const
 {
     return sichtbar || animation;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KEBeschreibung::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBeschreibung.h

@@ -45,4 +45,6 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };

+ 12 - 6
KSGClient/NachLogin/Editor/Karte/Dateien/KEDateien.cpp

@@ -41,12 +41,6 @@ KEDateien::KEDateien( int karte, Schrift *zSchrift )
 // Destruktor
 KEDateien::~KEDateien()
 {
-    if( run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
     fenster->release();
     editor->release();
     laden->release();
@@ -534,4 +528,16 @@ void KEDateien::render( Bild &zRObj )
 bool KEDateien::istSichtbar() const
 {
     return sichtbar || animation;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KEDateien::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Editor/Karte/Dateien/KEDateien.h

@@ -43,4 +43,6 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };

+ 13 - 6
KSGClient/NachLogin/Editor/Karte/KarteRelease/KERelease.cpp

@@ -107,12 +107,6 @@ KERelease::KERelease( int karte, Schrift *zSchrift )
 // Destruktor
 KERelease::~KERelease()
 {
-    if( run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
     fenster->release();
     abbilder->release();
     veröff->release();
@@ -308,6 +302,7 @@ void KERelease::thread()
     int anz = abbilder->getZeilenAnzahl();
     for( int i = 1; i < anz; i++ )
     {
+        hauptScreen->lock();
         abbilder->removeZeile( 1 );
         hauptScreen->unlock();
     }
@@ -458,4 +453,16 @@ void KERelease::render( Bild &zRObj )
 bool KERelease::istSichtbar() const
 {
     return sichtbar || animation;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KERelease::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Editor/Karte/KarteRelease/KERelease.h

@@ -59,6 +59,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 12 - 6
KSGClient/NachLogin/Editor/Karte/KartenEditor.cpp

@@ -41,12 +41,6 @@ KartenEditor::KartenEditor( Schrift *schrift )
 // Destruktor
 KartenEditor::~KartenEditor()
 {
-    if( run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
     schrift->release();
     karteRelease->release();
     shopSeite->release();
@@ -663,4 +657,16 @@ void KartenEditor::render( Bild &zRObj )
 bool KartenEditor::istSichtbar() const
 {
     return sichtbar;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KartenEditor::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Editor/Karte/KartenEditor.h

@@ -57,6 +57,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif;

+ 12 - 6
KSGClient/NachLogin/Editor/Karte/KaufHistorie/KaufHistorie.cpp

@@ -53,12 +53,6 @@ KEKaufHistorie::KEKaufHistorie( int karte, Schrift *zSchrift )
 // Destruktor
 KEKaufHistorie::~KEKaufHistorie()
 {
-    if( run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
     statistik->release();
     aktualisieren->release();
     gesammtVerkauf->release();
@@ -284,4 +278,16 @@ void KEKaufHistorie::render( Bild & zRObj )
 bool KEKaufHistorie::istSichtbar() const
 {
     return sichtbar || animation;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KEKaufHistorie::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Editor/Karte/KaufHistorie/KaufHistorie.h

@@ -40,4 +40,6 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };

+ 12 - 6
KSGClient/NachLogin/Editor/Karte/ShopSeite/KEShopSeite.cpp

@@ -39,12 +39,6 @@ KEShopSeite::KEShopSeite( int karte, Schrift *zSchrift )
 // Destruktor
 KEShopSeite::~KEShopSeite()
 {
-    if( run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
     fenster->release();
     editor->release();
     vorschau->release();
@@ -412,4 +406,16 @@ void KEShopSeite::render( Bild &zRObj )
 bool KEShopSeite::istSichtbar() const
 {
     return sichtbar || animation;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KEShopSeite::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Editor/Karte/ShopSeite/KEShopSeite.h

@@ -42,6 +42,8 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 12 - 6
KSGClient/NachLogin/Editor/Karte/Teams/KETeams.cpp

@@ -104,12 +104,6 @@ KETeams::KETeams( int karte, Schrift *zSchrift )
 // Destruktor
 KETeams::~KETeams()
 {
-    if( run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
     fenster->release();
     laden->release();
     schrift->release();
@@ -459,4 +453,16 @@ void KETeams::render( Bild &zRObj )
 bool KETeams::istSichtbar() const
 {
     return sichtbar || animation;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KETeams::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Editor/Karte/Teams/KETeams.h

@@ -58,4 +58,6 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };

+ 8 - 1
KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.cpp

@@ -402,7 +402,6 @@ SpielLaden::SpielLaden( Schrift *zSchrift )
 // Destruktor
 SpielLaden::~SpielLaden()
 {
-	warteAufThread( 1000 );
 	if( geladen )
 		hintergrundBild->release();
 	liste->release();
@@ -568,4 +567,12 @@ void SpielLaden::render( Bild &zRObj )
 int SpielLaden::getAlpha() const
 {
 	return hintergrundAlpha;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *SpielLaden::release()
+{
+    if( ref == 2 && run )
+        warteAufThread( 1000 );
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.h

@@ -125,6 +125,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	int getAlpha() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 24 - 8
KSGClient/NachLogin/Shop/Karten/KartenKaufen.cpp

@@ -63,10 +63,6 @@ KartenKaufenAuswahl::KartenKaufenAuswahl( Schrift * zSchrift )
 // Destruktor
 KartenKaufenAuswahl::~KartenKaufenAuswahl()
 {
-    if( run )
-        warteAufThread( 2000 );
-    if( run )
-        ende();
     if( fenster )
     {
         fenster->zurücksetzen();
@@ -455,6 +451,18 @@ void KartenKaufenAuswahl::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread * KartenKaufenAuswahl::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 2000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
+}
+
 
 // Inhalt der KartenKaufenListeEintrag Klasse aus KartenKaufen.h
 // Konstruktor
@@ -774,10 +782,6 @@ KartenKaufen::KartenKaufen( Schrift * zSchrift )
 // Destruktor
 KartenKaufen::~KartenKaufen()
 {
-    if( run )
-        warteAufThread( 1000 );
-    if( run )
-        ende();
     spielArt->release();
     suchText->release();
     ram->release();
@@ -1059,4 +1063,16 @@ void KartenKaufen::render( Bild & zRObj )
 bool KartenKaufen::istSichtbar() const
 {
     return sichtbar;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KartenKaufen::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 1000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 4 - 0
KSGClient/NachLogin/Shop/Karten/KartenKaufen.h

@@ -40,6 +40,8 @@ public:
 	void doTastaturEreignis( TastaturEreignis &te );
 	bool tick( double zeit );
 	void render( Bild &zRObj );
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class KartenKaufenListeEintrag
@@ -139,6 +141,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 760 - 744
KSGClient/NachLogin/Shop/Spiele/SpieleKaufen.cpp

@@ -10,289 +10,285 @@
 
 void SpielKaufenKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
 {
-	if( !p )
-		return;
-	( (SpieleKaufenAuswahl*)p )->ksgsAktion( parameter, retVal );
+    if( !p )
+        return;
+    ( (SpieleKaufenAuswahl *)p )->ksgsAktion( parameter, retVal );
 }
 
 // Inhalt der SpieleKaufenAuswahl Klasse aus SpieleKaufen.h
 // Konstruktor
-SpieleKaufenAuswahl::SpieleKaufenAuswahl( Schrift *zSchrift )
+SpieleKaufenAuswahl::SpieleKaufenAuswahl( Schrift * zSchrift )
     : Thread()
 {
-	spielId = 0;
-	alpha = 0;
-	ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
-	if( ksgs )
-	{
-		KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( ksgs, KSGS_START_FUNKTION );
-		if( getKSGScript )
-		{
-			fenster = getKSGScript();
-			fenster->setBildschirmZ( hauptScreen->getThis() );
-			fenster->setSchriftZ( zSchrift->getThis() );
-			fenster->setSize( 555, 380 );
-			fenster->setRückrufParam( this );
-			fenster->setRückrufFunktion( SpielKaufenKSGSAktion );
-		}
-		else
-		{
-			fenster = 0;
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-														  new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
-																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-														  new Text( "Ok" ), 0 );
-		}
-	}
-	else
-	{
-		fenster = 0;
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-													  new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
-													  new Text( "Ok" ), 0 );
-	}
-	ram = new LRahmen();
-	ram->setSize( 555, 380 );
-	ram->setFarbe( 0xFFFFFFFF );
-	laden = ( Framework::Animation2D* )ladeAnimation->dublizieren();
-	laden->setPosition( 252, 165 );
-	laden->setSichtbar( 0 );
-	pos = Punkt( 220, 55 );
-	aktion = 0;
+    spielId = 0;
+    alpha = 0;
+    ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
+    if( ksgs )
+    {
+        KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( ksgs, KSGS_START_FUNKTION );
+        if( getKSGScript )
+        {
+            fenster = getKSGScript();
+            fenster->setBildschirmZ( hauptScreen->getThis() );
+            fenster->setSchriftZ( zSchrift->getThis() );
+            fenster->setSize( 555, 380 );
+            fenster->setRückrufParam( this );
+            fenster->setRückrufFunktion( SpielKaufenKSGSAktion );
+        }
+        else
+        {
+            fenster = 0;
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                          new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
+                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                          new Text( "Ok" ), 0 );
+        }
+    }
+    else
+    {
+        fenster = 0;
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                      new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
+                                                      new Text( "Ok" ), 0 );
+    }
+    ram = new LRahmen();
+    ram->setSize( 555, 380 );
+    ram->setFarbe( 0xFFFFFFFF );
+    laden = ( Framework::Animation2D * )ladeAnimation->dublizieren();
+    laden->setPosition( 252, 165 );
+    laden->setSichtbar( 0 );
+    pos = Punkt( 220, 55 );
+    aktion = 0;
 }
 
 // Destruktor
 SpieleKaufenAuswahl::~SpieleKaufenAuswahl()
 {
-	if( run )
-		warteAufThread( 2000 );
-	if( run )
-		ende();
-	if( fenster )
-	{
-		fenster->zurücksetzen();
-		fenster->release();
-	}
-	ram->release();
-	laden->release();
-	if( ksgs )
-		Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
+    if( fenster )
+    {
+        fenster->zurücksetzen();
+        fenster->release();
+    }
+    ram->release();
+    laden->release();
+    if( ksgs )
+        Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
 }
 
 // nicht constant
 void SpieleKaufenAuswahl::ladeSpielSeite( int id )
 {
-	if( run )
-		warteAufThread( 2000 );
-	if( run )
-		return;
-	spielId = id;
-	aktion = 1;
-	start();
+    if( run )
+        warteAufThread( 2000 );
+    if( run )
+        return;
+    spielId = id;
+    aktion = 1;
+    start();
 }
 
 void SpieleKaufenAuswahl::reset()
 {
-	if( run )
-		warteAufThread( 2000 );
-	if( run )
-		return;
-	aktion = 0;
-	start();
+    if( run )
+        warteAufThread( 2000 );
+    if( run )
+        return;
+    aktion = 0;
+    start();
 }
 
 void SpieleKaufenAuswahl::thread()
 {
-	laden->setSichtbar( 1 );
-	if( !aktion || spielId )
-	{
-		while( alpha )
-			Sleep( 100 );
-		if( !aktion )
-			spielId = 0;
-		if( fenster )
-			fenster->zurücksetzen();
-	}
-	if( aktion )
-	{
-		while( alpha )
-			Sleep( 100 );
+    laden->setSichtbar( 1 );
+    if( !aktion || spielId )
+    {
+        while( alpha )
+            Sleep( 100 );
+        if( !aktion )
+            spielId = 0;
+        if( fenster )
+            fenster->zurücksetzen();
+    }
+    if( aktion )
+    {
+        while( alpha )
+            Sleep( 100 );
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient && shopClient->verbinde() )
+        if( shopClient &&shopClient->verbinde() )
         {
             shopClient->ladeSpielSeite( spielId );
             shopClient->trenne( 0 );
         }
-		Text *pfad = new Text( "data/tmp/shop/kaufen/spiele/" );
-		pfad->append( spielId );
-		pfad->append( "/seite.ksgs" );
-		if( fenster )
-		{
-			fenster->setScriptDatei( pfad );
-			fenster->neuLaden();
-		}
-	}
-	laden->setSichtbar( 0 );
-	run = 0;
+        Text *pfad = new Text( "data/tmp/shop/kaufen/spiele/" );
+        pfad->append( spielId );
+        pfad->append( "/seite.ksgs" );
+        if( fenster )
+        {
+            fenster->setScriptDatei( pfad );
+            fenster->neuLaden();
+        }
+    }
+    laden->setSichtbar( 0 );
+    run = 0;
 }
 
-void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
+void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSVariable * *retVal )
 {
-	KSGSVariable *befehl = parameter->z( 0 );
-	if( !befehl )
-		return;
-	Text *b = befehl->getText();
-	if( !b )
-		return;
-	if( b->istGleich( "GetBesitzStatus" ) )
-	{
+    KSGSVariable *befehl = parameter->z( 0 );
+    if( !befehl )
+        return;
+    Text * b = befehl->getText();
+    if( !b )
+        return;
+    if( b->istGleich( "GetBesitzStatus" ) )
+    {
         int besitz = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient && shopClient->verbinde() )
+        if( shopClient &&shopClient->verbinde() )
         {
             besitz = shopClient->getSpielBesitzStatus( spielId );
             shopClient->trenne( 0 );
         }
-		KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
-		if( getKSGSVariable )
-		{
-			KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += besitz ).getText() };
-			*retVal = getKSGSVariable( fenster, &def );
-		}
-		else
-		{
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-														  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-														  new Text( "Ok" ), 0 );
-		}
-		b->release();
-		return;
-	}
-	if( b->istGleich( "GetPreis" ) )
-	{
-		KSGSVariable *version = parameter->z( 1 );
-		if( !version )
-		{
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-														  new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-																	"Sie könnte eventuell nicht richtig funktionieren." ),
-														  new Text( "Ok" ), 0 );
-		}
-		else
-		{
-			bool testVersion = !version->getInt();
-			int preis = 0;
+        KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
+        if( getKSGSVariable )
+        {
+            KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += besitz ).getText() };
+            *retVal = getKSGSVariable( fenster, &def );
+        }
+        else
+        {
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                          new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
+                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                          new Text( "Ok" ), 0 );
+        }
+        b->release();
+        return;
+    }
+    if( b->istGleich( "GetPreis" ) )
+    {
+        KSGSVariable *version = parameter->z( 1 );
+        if( !version )
+        {
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                          new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
+                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                          new Text( "Ok" ), 0 );
+        }
+        else
+        {
+            bool testVersion = !version->getInt();
+            int preis = 0;
             if( !shopClient )
                 shopClient = mainClient->createShopServerClient();
-            if( shopClient && shopClient->verbinde() )
+            if( shopClient &&shopClient->verbinde() )
             {
                 preis = shopClient->getSpielPreis( spielId, testVersion );
                 shopClient->trenne( 0 );
             }
-			KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
-			if( getKSGSVariable )
-			{
-				KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += preis ).getText() };
-				*retVal = getKSGSVariable( fenster, &def );
-			}
-			else
-			{
-				nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-															  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-																		"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-															  new Text( "Ok" ), 0 );
-			}
-		}
-		b->release();
-		return;
-	}
-	if( b->istGleich( "GetTestVersionVerbleibend" ) )
-	{
-		int verbleibend = 0;
+            KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
+            if( getKSGSVariable )
+            {
+                KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += preis ).getText() };
+                *retVal = getKSGSVariable( fenster, &def );
+            }
+            else
+            {
+                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                              new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
+                                                              "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                              new Text( "Ok" ), 0 );
+            }
+        }
+        b->release();
+        return;
+    }
+    if( b->istGleich( "GetTestVersionVerbleibend" ) )
+    {
+        int verbleibend = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient && shopClient->verbinde() )
+        if( shopClient &&shopClient->verbinde() )
         {
             verbleibend = shopClient->getSpielTestversion( spielId );
             shopClient->trenne( 0 );
         }
-		KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
-		if( getKSGSVariable )
-		{
-			KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += verbleibend ).getText() };
-			*retVal = getKSGSVariable( fenster, &def );
-		}
-		else
-		{
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-														  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-														  new Text( "Ok" ), 0 );
-		}
-		b->release();
-		return;
-	}
-	if( b->istGleich( "GetErwerbbarStatus" ) )
-	{
-		int erwerbbar = 0;
+        KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
+        if( getKSGSVariable )
+        {
+            KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += verbleibend ).getText() };
+            *retVal = getKSGSVariable( fenster, &def );
+        }
+        else
+        {
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                          new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
+                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                          new Text( "Ok" ), 0 );
+        }
+        b->release();
+        return;
+    }
+    if( b->istGleich( "GetErwerbbarStatus" ) )
+    {
+        int erwerbbar = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient && shopClient->verbinde() )
+        if( shopClient &&shopClient->verbinde() )
         {
             erwerbbar = shopClient->istSpielErwerbbar( spielId );
             shopClient->trenne( 0 );
         }
-		KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
-		if( getKSGSVariable )
-		{
-			KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += erwerbbar ).getText() };
-			*retVal = getKSGSVariable( fenster, &def );
-		}
-		else
-		{
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-														  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-														  new Text( "Ok" ), 0 );
-		}
-		b->release();
-		return;
-	}
-	if( b->istGleich( "GetKupfer" ) )
-	{
-		int kupfer = infoClient->getKupfer();
-		KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
-		if( getKSGSVariable )
-		{
-			KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += kupfer ).getText() };
-			*retVal = getKSGSVariable( fenster, &def );
-		}
-		else
-		{
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-														  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-														  new Text( "Ok" ), 0 );
-		}
-		b->release();
-		return;
-	}
-	if( b->istGleich( "Kaufen" ) )
-	{
-		KSGSVariable *version = parameter->z( 1 );
-		if( !version )
-		{
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-														  new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-																	"Sie könnte eventuell nicht richtig funktionieren." ),
-														  new Text( "Ok" ), 0 );
-		}
-		else
-		{
-			bool testVersion = !version->getInt();
+        KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
+        if( getKSGSVariable )
+        {
+            KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += erwerbbar ).getText() };
+            *retVal = getKSGSVariable( fenster, &def );
+        }
+        else
+        {
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                          new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
+                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                          new Text( "Ok" ), 0 );
+        }
+        b->release();
+        return;
+    }
+    if( b->istGleich( "GetKupfer" ) )
+    {
+        int kupfer = infoClient->getKupfer();
+        KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
+        if( getKSGSVariable )
+        {
+            KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += kupfer ).getText() };
+            *retVal = getKSGSVariable( fenster, &def );
+        }
+        else
+        {
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                          new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
+                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                          new Text( "Ok" ), 0 );
+        }
+        b->release();
+        return;
+    }
+    if( b->istGleich( "Kaufen" ) )
+    {
+        KSGSVariable *version = parameter->z( 1 );
+        if( !version )
+        {
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                          new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
+                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                          new Text( "Ok" ), 0 );
+        }
+        else
+        {
+            bool testVersion = !version->getInt();
             if( !shopClient )
                 shopClient = mainClient->createShopServerClient();
             if( shopClient && shopClient->verbinde() )
@@ -364,679 +360,699 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVa
                                                               new Text( mainClient->getLetzterFehler() ),
                                                               new Text( "Ok" ), 0 );
             }
-			if( run )
-				warteAufThread( 2000 );
-			if( run )
-			{
-				b->release();
-				return;
-			}
-			aktion = 1;
-			start();
-		}
-		b->release();
-		return;
-	}
-	if( b->istGleich( "GetBild" ) )
-	{
-		KSGSVariable *pfad = parameter->z( 1 );
-		KSGSVariable *name = parameter->z( 2 );
-		if( !pfad || !name )
-		{
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-														  new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-																	"Sie könnte eventuell nicht richtig funktionieren." ),
-														  new Text( "Ok" ), 0 );
-		}
-		else
-		{
-			Text *pf = pfad->getText();
-			Text *n = name->getText();
-			if( !pf || !n )
-			{
-				nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-															  new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-																		"Sie könnte eventuell nicht richtig funktionieren." ),
-															  new Text( "Ok" ), 0 );
-			}
-			else
-			{
-				KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
-				if( getKSGSVariable )
-				{
-					int p = n->positionVon( ".ltdb/" );
-					if( p < 0 )
-						p = 0;
-					else
-						p += 6;
+            if( run )
+                warteAufThread( 2000 );
+            if( run )
+            {
+                b->release();
+                return;
+            }
+            aktion = 1;
+            start();
+        }
+        b->release();
+        return;
+    }
+    if( b->istGleich( "GetBild" ) )
+    {
+        KSGSVariable *pfad = parameter->z( 1 );
+        KSGSVariable *name = parameter->z( 2 );
+        if( !pfad || !name )
+        {
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                          new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
+                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                          new Text( "Ok" ), 0 );
+        }
+        else
+        {
+            Text *pf = pfad->getText();
+            Text *n = name->getText();
+            if( !pf || !n )
+            {
+                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                              new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
+                                                              "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                              new Text( "Ok" ), 0 );
+            }
+            else
+            {
+                KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
+                if( getKSGSVariable )
+                {
+                    int p = n->positionVon( ".ltdb/" );
+                    if( p < 0 )
+                        p = 0;
+                    else
+                        p += 6;
                     Text nn = Text( pf->getText() ) + "/" + (const char *)( n->getText() + p );
                     Bild * b = bilder->get( nn );
-					if( b )
-					{
-						KSGSVariableDef def = { KSGS_BILD, 0, 3, "" };
-						KSGSVariable *ret = getKSGSVariable( fenster, &def );
-						KSGSSetBild setKSGSBild = (KSGSSetBild)GetProcAddress( ksgs, KSGS_SET_BILD_FUNKTION );
-						if( !setKSGSBild )
-						{
-							nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-																		  new Text( "Der Einstiegspunkt '" KSGS_SET_BILD_FUNKTION "' in der DLL-Datei "
-																		  "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-																		  new Text( "Ok" ), 0 );
-							b->release();
-						}
-						else
-							setKSGSBild( ret, b );
-						*retVal = ret;
-					}
-				}
-				else
-				{
-					nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-																  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-																			"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-																  new Text( "Ok" ), 0 );
-				}
-			}
-			if( pf )
-				pf->release();
-			if( n )
-				n->release();
-		}
-		b->release();
-		return;
-	}
+                    if( b )
+                    {
+                        KSGSVariableDef def = { KSGS_BILD, 0, 3, "" };
+                        KSGSVariable *ret = getKSGSVariable( fenster, &def );
+                        KSGSSetBild setKSGSBild = (KSGSSetBild)GetProcAddress( ksgs, KSGS_SET_BILD_FUNKTION );
+                        if( !setKSGSBild )
+                        {
+                            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                                          new Text( "Der Einstiegspunkt '" KSGS_SET_BILD_FUNKTION "' in der DLL-Datei "
+                                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                          new Text( "Ok" ), 0 );
+                            b->release();
+                        }
+                        else
+                            setKSGSBild( ret, b );
+                        *retVal = ret;
+                    }
+                }
+                else
+                {
+                    nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
+                                                                  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
+                                                                  "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                  new Text( "Ok" ), 0 );
+                }
+            }
+            if( pf )
+                pf->release();
+            if( n )
+                n->release();
+        }
+        b->release();
+        return;
+    }
 }
 
-void SpieleKaufenAuswahl::doMausEreignis( MausEreignis &me )
+void SpieleKaufenAuswahl::doMausEreignis( MausEreignis & me )
 {
-	if( run )
-		return;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	if( fenster )
-		fenster->doMausEreignis( me );
-	me.mx += pos.x;
-	me.my += pos.y;
+    if( run )
+        return;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    if( fenster )
+        fenster->doMausEreignis( me );
+    me.mx += pos.x;
+    me.my += pos.y;
 }
 
-void SpieleKaufenAuswahl::doTastaturEreignis( TastaturEreignis &te )
+void SpieleKaufenAuswahl::doTastaturEreignis( TastaturEreignis & te )
 {
-	if( run )
-		return;
-	if( fenster )
-		fenster->doTastaturEreignis( te );
+    if( run )
+        return;
+    if( fenster )
+        fenster->doTastaturEreignis( te );
 }
 
 bool SpieleKaufenAuswahl::tick( double zeit )
 {
-	bool rend = ( fenster && !run ) ? fenster->tick( zeit ) : 0;
-	rend |= laden->tick( zeit );
-	if( ( run || !spielId ) && alpha > 0 )
-	{
-		if( alpha - zeit * 150 < 0 )
-			alpha = 0;
-		else
-			alpha -= (unsigned char)( zeit * 150 );
-		rend = 1;
-	}
-	if( !run && spielId && alpha < 255 )
-	{
-		if( alpha + zeit * 150 > 255 )
-			alpha = 255;
-		else
-			alpha += (unsigned char)( zeit * 150 );
-		rend = 1;
-	}
-	return rend;
+    bool rend = ( fenster && !run ) ? fenster->tick( zeit ) : 0;
+    rend |= laden->tick( zeit );
+    if( ( run || !spielId ) && alpha > 0 )
+    {
+        if( alpha - zeit * 150 < 0 )
+            alpha = 0;
+        else
+            alpha -= (unsigned char)( zeit * 150 );
+        rend = 1;
+    }
+    if( !run && spielId &&alpha < 255 )
+    {
+        if( alpha + zeit * 150 > 255 )
+            alpha = 255;
+        else
+            alpha += (unsigned char)( zeit * 150 );
+        rend = 1;
+    }
+    return rend;
 }
 
-void SpieleKaufenAuswahl::render( Bild &zRObj )
+void SpieleKaufenAuswahl::render( Bild & zRObj )
 {
-	if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getHeight() ) )
-		return;
-	zRObj.setAlpha( alpha );
-	ram->render( zRObj );
-	if( fenster )
-		fenster->render( zRObj );
-	zRObj.releaseAlpha();
-	laden->render( zRObj );
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getHeight() ) )
+        return;
+    zRObj.setAlpha( alpha );
+    ram->render( zRObj );
+    if( fenster )
+        fenster->render( zRObj );
+    zRObj.releaseAlpha();
+    laden->render( zRObj );
+    zRObj.releaseDrawOptions();
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread * SpieleKaufenAuswahl::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 2000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }
 
 
 // Inhalt der SpieleKaufenListeEintrag Klasse aus SpieleKaufen.h
 // Konstruktor
-SpieleKaufenListeEintrag::SpieleKaufenListeEintrag( int id, Schrift *schrift )
+SpieleKaufenListeEintrag::SpieleKaufenListeEintrag( int id, Schrift * schrift )
 {
-	spielId = id;
-	auswählen = initKnopf( 173, 73, 22, 22, 0, 0, "" );
-	auswählen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Rahmen | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	auswählen->setHintergrundBildZ( bilder->get( "data/client/bilder/shop.ltdb/weiter.png" ) );
-	initToolTip( auswählen, "Spiel auswählen.", schrift, hauptScreen );
+    spielId = id;
+    auswählen = initKnopf( 173, 73, 22, 22, 0, 0, "" );
+    auswählen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Rahmen | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    auswählen->setHintergrundBildZ( bilder->get( "data/client/bilder/shop.ltdb/weiter.png" ) );
+    initToolTip( auswählen, "Spiel auswählen.", schrift, hauptScreen );
     schrift->release();
-	auswählen->setRahmenBreite( 1 );
-	LTDBDatei *datei = new LTDBDatei();
-	Text *bdpf = new Text( "data/tmp/shop/kaufen/spiele/" );
-	bdpf->append( id );
-	bdpf->append( "/titelbg.ltdb" );
-	datei->setDatei( bdpf );
-	hintergrund = datei->laden( 0, new Text( "auswbg.jpg" ) );
-	datei->release();
-	ausgewählt = new AlphaFeld();
-	ausgewählt->setPosition( 1, 1 );
-	ausgewählt->setSize( 198, 98 );
-	ausgewählt->setFarbe( 0x0000FF00 );
-	ausgewählt->setStrength( 10 );
-	ram = new LRahmen();
-	ram->setSize( 200, 100 );
-	ram->setFarbe( 0xFFFFFFFF );
-	ausw = 0;
-	rend = 0;
-	ref = 1;
+    auswählen->setRahmenBreite( 1 );
+    LTDBDatei * datei = new LTDBDatei();
+    Text * bdpf = new Text( "data/tmp/shop/kaufen/spiele/" );
+    bdpf->append( id );
+    bdpf->append( "/titelbg.ltdb" );
+    datei->setDatei( bdpf );
+    hintergrund = datei->laden( 0, new Text( "auswbg.jpg" ) );
+    datei->release();
+    ausgewählt = new AlphaFeld();
+    ausgewählt->setPosition( 1, 1 );
+    ausgewählt->setSize( 198, 98 );
+    ausgewählt->setFarbe( 0x0000FF00 );
+    ausgewählt->setStrength( 10 );
+    ram = new LRahmen();
+    ram->setSize( 200, 100 );
+    ram->setFarbe( 0xFFFFFFFF );
+    ausw = 0;
+    rend = 0;
+    ref = 1;
 }
 
 // Destruktor
 SpieleKaufenListeEintrag::~SpieleKaufenListeEintrag()
 {
-	auswählen->release();
-	if( hintergrund )
-		hintergrund->release();
-	ausgewählt->release();
-	ram->release();
+    auswählen->release();
+    if( hintergrund )
+        hintergrund->release();
+    ausgewählt->release();
+    ram->release();
 }
 
 // nicht constant
 void SpieleKaufenListeEintrag::resetAuswahl()
 {
-	ausw = 0;
+    ausw = 0;
 }
 
-bool SpieleKaufenListeEintrag::doMausEreignis( MausEreignis &me )
+bool SpieleKaufenListeEintrag::doMausEreignis( MausEreignis & me )
 {
-	bool vera = me.verarbeitet;
-	auswählen->doMausEreignis( me );
-	if( !vera && me.verarbeitet && me.id == ME_RLinks )
-	{
-		ausw = 1;
-		return 1;
-	}
-	return 0;
+    bool vera = me.verarbeitet;
+    auswählen->doMausEreignis( me );
+    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    {
+        ausw = 1;
+        return 1;
+    }
+    return 0;
 }
 
 bool SpieleKaufenListeEintrag::tick( double zeit )
 {
-	rend |= ausgewählt->tick( zeit );
-	rend |= auswählen->tick( zeit );
-	int a = ( ausgewählt->getFarbe() >> 24 ) & 0xFF;
-	if( ausw && a < 255 )
-	{
-		if( a + 150 * zeit > 255 )
-			a = 255;
-		else
-			a += (int)( 150 * zeit );
-		ausgewählt->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( ausgewählt->getFarbe() & 0xFFFFFF ) );
-		rend = 1;
-	}
-	if( !ausw && a > 0 )
-	{
-		if( a - 150 * zeit < 0 )
-			a = 0;
-		else
-			a -= (int)( 150 * zeit );
-		ausgewählt->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( ausgewählt->getFarbe() & 0xFFFFFF ) );
-		rend = 1;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= ausgewählt->tick( zeit );
+    rend |= auswählen->tick( zeit );
+    int a = ( ausgewählt->getFarbe() >> 24 ) & 0xFF;
+    if( ausw && a < 255 )
+    {
+        if( a + 150 * zeit > 255 )
+            a = 255;
+        else
+            a += (int)( 150 * zeit );
+        ausgewählt->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( ausgewählt->getFarbe() & 0xFFFFFF ) );
+        rend = 1;
+    }
+    if( !ausw && a > 0 )
+    {
+        if( a - 150 * zeit < 0 )
+            a = 0;
+        else
+            a -= (int)( 150 * zeit );
+        ausgewählt->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( ausgewählt->getFarbe() & 0xFFFFFF ) );
+        rend = 1;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
-void SpieleKaufenListeEintrag::render( int yOff, Bild &zRObj )
+void SpieleKaufenListeEintrag::render( int yOff, Bild & zRObj )
 {
-	if( !zRObj.setDrawOptions( 0, yOff, 200, 100 ) )
-		return;
-	ram->render( zRObj );
-	if( hintergrund )
-		zRObj.drawBild( 1, 1, 198, 98, *hintergrund );
-	ausgewählt->render( zRObj );
-	auswählen->render( zRObj );
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( 0, yOff, 200, 100 ) )
+        return;
+    ram->render( zRObj );
+    if( hintergrund )
+        zRObj.drawBild( 1, 1, 198, 98, *hintergrund );
+    ausgewählt->render( zRObj );
+    auswählen->render( zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int SpieleKaufenListeEintrag::getSpielId() const
 {
-	return spielId;
+    return spielId;
 }
 
 // Reference Counting
 SpieleKaufenListeEintrag *SpieleKaufenListeEintrag::getThis()
 {
-	ref++;
-	return this;
+    ref++;
+    return this;
 }
 
 SpieleKaufenListeEintrag *SpieleKaufenListeEintrag::release()
 {
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
 }
 
 
 // Inhalt der SpieleKaufenListe Klasse aus SpieleKaufen.h
 // Konstruktor
-SpieleKaufenListe::SpieleKaufenListe( Schrift *schrift )
+SpieleKaufenListe::SpieleKaufenListe( Schrift * schrift )
 {
-	s = schrift;
-	pos = Punkt( 5, 55 );
-	ram = new LRahmen();
-	ram->setSize( 215, 380 );
-	ram->setFarbe( 0xFFFFFFFF );
-	einträge = new RCArray< SpieleKaufenListeEintrag >();
-	vScroll = new VScrollBar();
-	vScroll->setKlickScroll( 10 );
-	vScroll->update( 0, 380 );
-	rend = 0;
-	ref = 1;
+    s = schrift;
+    pos = Punkt( 5, 55 );
+    ram = new LRahmen();
+    ram->setSize( 215, 380 );
+    ram->setFarbe( 0xFFFFFFFF );
+    einträge = new RCArray< SpieleKaufenListeEintrag >();
+    vScroll = new VScrollBar();
+    vScroll->setKlickScroll( 10 );
+    vScroll->update( 0, 380 );
+    rend = 0;
+    ref = 1;
 }
 
 // Destruktor
 SpieleKaufenListe::~SpieleKaufenListe()
 {
-	s->release();
-	ram->release();
-	einträge->release();
-	vScroll->release();
+    s->release();
+    ram->release();
+    einträge->release();
+    vScroll->release();
 }
 
 // nicht constant
-void SpieleKaufenListe::ladeSpiele( Array< int > *spiele )
+void SpieleKaufenListe::ladeSpiele( Array< int > * spiele )
 {
-	leeren();
-	int anz = spiele->getEintragAnzahl();
+    leeren();
+    int anz = spiele->getEintragAnzahl();
     if( !shopClient )
         shopClient = mainClient->createShopServerClient();
-    if( shopClient && shopClient->verbinde() )
+    if( shopClient &&shopClient->verbinde() )
     {
-	    for( int i = 0; i < anz; i++ )
-	    {
-		    if( shopClient->ladeSpielTitel( spiele->hat( i ) ? spiele->get( i ) : 0 ) )
-			    einträge->add( new SpieleKaufenListeEintrag( spiele->hat( i ) ? spiele->get( i ) : 0, s->getThis() ) );
-	    }
+        for( int i = 0; i < anz; i++ )
+        {
+            if( shopClient->ladeSpielTitel( spiele->hat( i ) ? spiele->get( i ) : 0 ) )
+                einträge->add( new SpieleKaufenListeEintrag( spiele->hat( i ) ? spiele->get( i ) : 0, s->getThis() ) );
+        }
         shopClient->trenne( 0 );
     }
-	vScroll->update( anz * 100, 380 );
-	rend = 1;
+    vScroll->update( anz * 100, 380 );
+    rend = 1;
 }
 
 void SpieleKaufenListe::leeren()
 {
     cs.lock();
-	einträge->leeren();
+    einträge->leeren();
     cs.unlock();
-	vScroll->update( 0, 380 );
-	rend = 1;
+    vScroll->update( 0, 380 );
+    rend = 1;
 }
 
-int SpieleKaufenListe::doMausEreignis( MausEreignis &me )
+int SpieleKaufenListe::doMausEreignis( MausEreignis & me )
 {
-	int mx = me.mx;
-	int my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	vScroll->doMausMessage( 200, 0, 15, 380, me );
-	me.my += vScroll->getScroll();
-	int ret = 0;
+    int mx = me.mx;
+    int my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    vScroll->doMausMessage( 200, 0, 15, 380, me );
+    me.my += vScroll->getScroll();
+    int ret = 0;
     cs.lock();
-	int anz = einträge->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		if( einträge->z( i )->doMausEreignis( me ) )
-			ret = einträge->z( i )->getSpielId();
-		me.my -= 100;
-	}
-	if( ret )
-	{
-		for( int i = 0; i < anz; i++ )
-		{
-			if( einträge->z( i )->getSpielId() != ret )
-				einträge->z( i )->resetAuswahl();
-		}
-	}
+    int anz = einträge->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( einträge->z( i )->doMausEreignis( me ) )
+            ret = einträge->z( i )->getSpielId();
+        me.my -= 100;
+    }
+    if( ret )
+    {
+        for( int i = 0; i < anz; i++ )
+        {
+            if( einträge->z( i )->getSpielId() != ret )
+                einträge->z( i )->resetAuswahl();
+        }
+    }
     cs.unlock();
-	me.mx = mx;
-	me.my = my;
-	return ret;
+    me.mx = mx;
+    me.my = my;
+    return ret;
 }
 
 bool SpieleKaufenListe::tick( double zeit )
 {
-	rend |= vScroll->getRend();
+    rend |= vScroll->getRend();
     cs.lock();
-	int anz = einträge->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		rend |= einträge->z( i )->tick( zeit );
+    int anz = einträge->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        rend |= einträge->z( i )->tick( zeit );
     cs.unlock();
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
-void SpieleKaufenListe::render( Bild &zRObj )
+void SpieleKaufenListe::render( Bild & zRObj )
 {
-	int br = ram->getBreite();
-	int hö = ram->getHeight();
-	if( !zRObj.setDrawOptions( pos.x, pos.y, br, hö ) )
-		return;
-	ram->render( zRObj );
+    int br = ram->getBreite();
+    int hö = ram->getHeight();
+    if( !zRObj.setDrawOptions( pos.x, pos.y, br, hö ) )
+        return;
+    ram->render( zRObj );
     cs.lock();
-	int anz = einträge->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		einträge->z( i )->render( i * 100 - vScroll->getScroll(), zRObj );
+    int anz = einträge->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        einträge->z( i )->render( i * 100 - vScroll->getScroll(), zRObj );
     cs.unlock();
-	vScroll->render( 200, 0, 15, 380, zRObj );
-	zRObj.releaseDrawOptions();
+    vScroll->render( 200, 0, 15, 380, zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int SpieleKaufenListe::getEintragAnzahl()
 {
-	return einträge->getEintragAnzahl();
+    return einträge->getEintragAnzahl();
 }
 
 // Reference Counting
 SpieleKaufenListe *SpieleKaufenListe::getThis()
 {
-	ref++;
-	return this;
+    ref++;
+    return this;
 }
 
 SpieleKaufenListe *SpieleKaufenListe::release()
 {
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
 }
 
 
 // Inhalt der SpieleKaufen Klasse aus SpieleKaufen.h
 // Konstruktor
-SpieleKaufen::SpieleKaufen( Schrift *zSchrift )
-	: Thread()
+SpieleKaufen::SpieleKaufen( Schrift * zSchrift )
+    : Thread()
 {
-	Bild *shopZurück = bilder->get( "data/client/bilder/shop.ltdb/zurück.png" );
-	Bild *shopWeiter = bilder->get( "data/client/bilder/shop.ltdb/weiter.png" );
-	alpha = 255;
-	sichtbar = 0;
-	suchText = new Text( "" );
-	ram = new LRahmen();
-	ram->setSize( 780, 440 );
-	ram->setFarbe( 0xFFFFFFFF );
-	pos = Punkt( 10, 50 );
-	suchFilterT = initTextFeld( 5, 5, 70, 20, zSchrift, TextFeld::Style::Text, "Suchfilter:" );
-	suchFilter = initTextFeld( 80, 5, 225, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-	initToolTip( suchFilter, "Gebe etwas vom Namen des Spieles ein, nach dem du suchst.", zSchrift, hauptScreen );
-	suchen = initKnopf( 310, 5, 100, 20, zSchrift, Knopf::Style::Sichtbar, "suchen" );
-	seiten = initTextFeld( 55, 30, 250, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Seite 0 von 0, 0 Funde." );
-	zurück = initKnopf( 5, 30, 20, 20, 0, 0, "" );
-	zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	zurück->setHintergrundBildZ( shopZurück );
-	initToolTip( zurück, "Seite zurück blättern.", zSchrift, hauptScreen );
-	weiter = initKnopf( 30, 30, 20, 20, 0, 0, "" );
-	weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	weiter->setHintergrundBildZ( shopWeiter );
-	initToolTip( weiter, "Seite weiter blättern.", zSchrift, hauptScreen );
-	liste = new SpieleKaufenListe( zSchrift->getThis() );
-	auswahl = new SpieleKaufenAuswahl( zSchrift );
-	laden = ( Framework::Animation2D* )ladeAnimation->dublizieren();
-	laden->setPosition( 365, 195 );
-	laden->setSichtbar( 0 );
-	tickVal = 0;
-	seite = 0;
-	maxSeite = 0;
-	rend = 0;
+    Bild *shopZurück = bilder->get( "data/client/bilder/shop.ltdb/zurück.png" );
+    Bild *shopWeiter = bilder->get( "data/client/bilder/shop.ltdb/weiter.png" );
+    alpha = 255;
+    sichtbar = 0;
+    suchText = new Text( "" );
+    ram = new LRahmen();
+    ram->setSize( 780, 440 );
+    ram->setFarbe( 0xFFFFFFFF );
+    pos = Punkt( 10, 50 );
+    suchFilterT = initTextFeld( 5, 5, 70, 20, zSchrift, TextFeld::Style::Text, "Suchfilter:" );
+    suchFilter = initTextFeld( 80, 5, 225, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+    initToolTip( suchFilter, "Gebe etwas vom Namen des Spieles ein, nach dem du suchst.", zSchrift, hauptScreen );
+    suchen = initKnopf( 310, 5, 100, 20, zSchrift, Knopf::Style::Sichtbar, "suchen" );
+    seiten = initTextFeld( 55, 30, 250, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Seite 0 von 0, 0 Funde." );
+    zurück = initKnopf( 5, 30, 20, 20, 0, 0, "" );
+    zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    zurück->setHintergrundBildZ( shopZurück );
+    initToolTip( zurück, "Seite zurück blättern.", zSchrift, hauptScreen );
+    weiter = initKnopf( 30, 30, 20, 20, 0, 0, "" );
+    weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    weiter->setHintergrundBildZ( shopWeiter );
+    initToolTip( weiter, "Seite weiter blättern.", zSchrift, hauptScreen );
+    liste = new SpieleKaufenListe( zSchrift->getThis() );
+    auswahl = new SpieleKaufenAuswahl( zSchrift );
+    laden = ( Framework::Animation2D * )ladeAnimation->dublizieren();
+    laden->setPosition( 365, 195 );
+    laden->setSichtbar( 0 );
+    tickVal = 0;
+    seite = 0;
+    maxSeite = 0;
+    rend = 0;
 }
 
 // Destruktor
 SpieleKaufen::~SpieleKaufen()
 {
-	if( run )
-		warteAufThread( 1000 );
-	if( run )
-		ende();
-	suchText->release();
-	ram->release();
-	suchFilter->release();
-	suchFilterT->release();
-	suchen->release();
-	seiten->release();
-	weiter->release();
-	zurück->release();
-	liste->release();
-	auswahl->release();
-	laden->release();
+    suchText->release();
+    ram->release();
+    suchFilter->release();
+    suchFilterT->release();
+    suchen->release();
+    seiten->release();
+    weiter->release();
+    zurück->release();
+    liste->release();
+    auswahl->release();
+    laden->release();
 }
 
 // nicht constant
 void SpieleKaufen::setSichtbar( bool sicht )
 {
-	sichtbar = sicht;
-	if( sichtbar && !liste->getEintragAnzahl() )
-	{
-		MausEreignis me;
-		me.id = ME_RLinks;
-		me.verarbeitet = 0;
-		me.mx = suchen->getX() + 1 + pos.x;
-		me.my = suchen->getY() + 1 + pos.y;
-		doMausEreignis( me );
-	}
+    sichtbar = sicht;
+    if( sichtbar && !liste->getEintragAnzahl() )
+    {
+        MausEreignis me;
+        me.id = ME_RLinks;
+        me.verarbeitet = 0;
+        me.mx = suchen->getX() + 1 + pos.x;
+        me.my = suchen->getY() + 1 + pos.y;
+        doMausEreignis( me );
+    }
 }
 
 void SpieleKaufen::thread()
 {
-	laden->setSichtbar( 1 );
-	Array< int > *list = 0;
+    laden->setSichtbar( 1 );
+    Array< int > *list = 0;
     if( !shopClient )
         shopClient = mainClient->createShopServerClient();
-    if( shopClient && shopClient->verbinde() )
+    if( shopClient &&shopClient->verbinde() )
     {
         list = shopClient->suchSpiele( suchText->getText() );
         shopClient->trenne( 0 );
     }
-	if( !list )
-	{
-		laden->setSichtbar( 0 );
-		run = 0;
-		return;
-	}
-	Array< int > *slist = new Array< int >();
-	int anz = list->getEintragAnzahl();
-	maxSeite = anz / 10 + 1;
-	if( !( anz % 10 ) )
-		maxSeite--;
-	while( anz <= seite * 10 && seite > 0 )
-		seite--;
-	for( int i = seite * 10; i < anz && i < seite * 10 + 10; i++ )
-		slist->add( list->hat( i ) ? list->get( i ) : 0 );
-	list->release();
-	auswahl->reset();
-	liste->ladeSpiele( slist );
-	slist->release();
-	Text *t = new Text( "Seite " );
-	t->append( maxSeite ? seite + 1 : 0 );
-	t->append( " von " );
-	t->append( maxSeite );
-	t->append( ", " );
-	t->append( anz );
-	if( anz == 1 )
-		t->append( " Fund." );
-	else
-		t->append( " Funde." );
-	seiten->setText( t );
-	zurück->setStyle( TextFeld::Style::Erlaubt, seite > 0 );
-	weiter->setStyle( TextFeld::Style::Erlaubt, seite + 1 < maxSeite );
-	laden->setSichtbar( 0 );
-	run = 0;
+    if( !list )
+    {
+        laden->setSichtbar( 0 );
+        run = 0;
+        return;
+    }
+    Array< int > *slist = new Array< int >();
+    int anz = list->getEintragAnzahl();
+    maxSeite = anz / 10 + 1;
+    if( !( anz % 10 ) )
+        maxSeite--;
+    while( anz <= seite * 10 && seite > 0 )
+        seite--;
+    for( int i = seite * 10; i < anz && i < seite * 10 + 10; i++ )
+        slist->add( list->hat( i ) ? list->get( i ) : 0 );
+    list->release();
+    auswahl->reset();
+    liste->ladeSpiele( slist );
+    slist->release();
+    Text * t = new Text( "Seite " );
+    t->append( maxSeite ? seite + 1 : 0 );
+    t->append( " von " );
+    t->append( maxSeite );
+    t->append( ", " );
+    t->append( anz );
+    if( anz == 1 )
+        t->append( " Fund." );
+    else
+        t->append( " Funde." );
+    seiten->setText( t );
+    zurück->setStyle( TextFeld::Style::Erlaubt, seite > 0 );
+    weiter->setStyle( TextFeld::Style::Erlaubt, seite + 1 < maxSeite );
+    laden->setSichtbar( 0 );
+    run = 0;
 }
 
-void SpieleKaufen::doMausEreignis( MausEreignis &me )
+void SpieleKaufen::doMausEreignis( MausEreignis & me )
 {
-	if( !sichtbar || run )
-		return;
-	int mx = me.mx;
-	int my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	suchFilter->doMausEreignis( me );
-	int auswId = liste->doMausEreignis( me );
-	if( auswId )
-		auswahl->ladeSpielSeite( auswId );
-	auswahl->doMausEreignis( me );
-	int ak = 0;
-	bool tmp = me.verarbeitet;
-	suchen->doMausEreignis( me );
-	ak = me.verarbeitet ? 1 : 0;
-	zurück->doMausEreignis( me );
-	ak = me.verarbeitet && !ak ? 2 : ak;
-	weiter->doMausEreignis( me );
-	ak = me.verarbeitet && !ak ? 3 : ak;
-	if( tmp )
-		ak = 0;
-	if( me.id == ME_RLinks )
-	{
-		switch( ak )
-		{
-		case 1: // Suchen
-			suchText->setText( suchFilter->zText()->getText() );
-			seite = 1;
-			maxSeite = 1;
-			start();
-			break;
-		case 2: // Seite zurück blättern
-			seite--;
-			if( seite < 1 )
-				seite = 1;
-			start();
-			break;
-		case 3: // Seite vorwärts blättern
-			seite++;
-			if( seite > maxSeite )
-				seite = maxSeite;
-			start();
-			break;
-		}
-	}
-	me.mx = mx;
-	me.my = my;
+    if( !sichtbar || run )
+        return;
+    int mx = me.mx;
+    int my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    suchFilter->doMausEreignis( me );
+    int auswId = liste->doMausEreignis( me );
+    if( auswId )
+        auswahl->ladeSpielSeite( auswId );
+    auswahl->doMausEreignis( me );
+    int ak = 0;
+    bool tmp = me.verarbeitet;
+    suchen->doMausEreignis( me );
+    ak = me.verarbeitet ? 1 : 0;
+    zurück->doMausEreignis( me );
+    ak = me.verarbeitet && !ak ? 2 : ak;
+    weiter->doMausEreignis( me );
+    ak = me.verarbeitet && !ak ? 3 : ak;
+    if( tmp )
+        ak = 0;
+    if( me.id == ME_RLinks )
+    {
+        switch( ak )
+        {
+        case 1: // Suchen
+            suchText->setText( suchFilter->zText()->getText() );
+            seite = 1;
+            maxSeite = 1;
+            start();
+            break;
+        case 2: // Seite zurück blättern
+            seite--;
+            if( seite < 1 )
+                seite = 1;
+            start();
+            break;
+        case 3: // Seite vorwärts blättern
+            seite++;
+            if( seite > maxSeite )
+                seite = maxSeite;
+            start();
+            break;
+        }
+    }
+    me.mx = mx;
+    me.my = my;
 }
 
-void SpieleKaufen::doTastaturEreignis( TastaturEreignis &te )
+void SpieleKaufen::doTastaturEreignis( TastaturEreignis & te )
 {
-	if( !sichtbar || run )
-		return;
-	bool vera = te.verarbeitet;
-	suchFilter->doTastaturEreignis( te );
-	if( !vera && te.verarbeitet && te.taste == T_Enter && te.id == TE_Release )
-	{
-		MausEreignis me;
-		me.id = ME_RLinks;
-		me.verarbeitet = 0;
-		me.mx = suchen->getX() + 1 + pos.x;
-		me.my = suchen->getY() + 1 + pos.y;
-		doMausEreignis( me );
-	}
-	auswahl->doTastaturEreignis( te );
+    if( !sichtbar || run )
+        return;
+    bool vera = te.verarbeitet;
+    suchFilter->doTastaturEreignis( te );
+    if( !vera && te.verarbeitet &&te.taste == T_Enter && te.id == TE_Release )
+    {
+        MausEreignis me;
+        me.id = ME_RLinks;
+        me.verarbeitet = 0;
+        me.mx = suchen->getX() + 1 + pos.x;
+        me.my = suchen->getY() + 1 + pos.y;
+        doMausEreignis( me );
+    }
+    auswahl->doTastaturEreignis( te );
 }
 
 bool SpieleKaufen::tick( double zeit )
 {
-	rend |= suchFilter->tick( zeit );
-	rend |= suchFilterT->tick( zeit );
-	rend |= suchen->tick( zeit );
-	rend |= weiter->tick( zeit );
-	rend |= zurück->tick( zeit );
-	rend |= liste->tick( zeit );
-	rend |= auswahl->tick( zeit );
-	rend |= laden->tick( zeit );
-	tickVal += zeit * 250;
-	int val = (int)tickVal;
-	if( val < 1 )
-	{
-		bool ret = rend;
-		rend = 0;
-		return ret;
-	}
-	if( val > 10 )
-		val = 10;
-	tickVal -= val;
-	if( sichtbar && alpha != 255 && !run )
-	{
-		if( alpha + val > 255 )
-			alpha = 255;
-		else
-			alpha += val;
-		rend = 1;
-	}
-	if( sichtbar && alpha != 125 && run )
-	{
-		if( alpha > 125 )
-		{
-			if( alpha - val < 125 )
-				alpha = 125;
-			else
-				alpha -= val;
-			rend = 1;
-		}
-		else
-		{
-			if( alpha + val > 125 )
-				alpha = 125;
-			else
-				alpha += 125;
-			rend = 1;
-		}
-	}
-	if( !sichtbar && alpha != 0 )
-	{
-		if( alpha - val < 0 )
-			alpha = 0;
-		else
-			alpha -= val;
-		rend = 1;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= suchFilter->tick( zeit );
+    rend |= suchFilterT->tick( zeit );
+    rend |= suchen->tick( zeit );
+    rend |= weiter->tick( zeit );
+    rend |= zurück->tick( zeit );
+    rend |= liste->tick( zeit );
+    rend |= auswahl->tick( zeit );
+    rend |= laden->tick( zeit );
+    tickVal += zeit * 250;
+    int val = (int)tickVal;
+    if( val < 1 )
+    {
+        bool ret = rend;
+        rend = 0;
+        return ret;
+    }
+    if( val > 10 )
+        val = 10;
+    tickVal -= val;
+    if( sichtbar && alpha != 255 && !run )
+    {
+        if( alpha + val > 255 )
+            alpha = 255;
+        else
+            alpha += val;
+        rend = 1;
+    }
+    if( sichtbar && alpha != 125 && run )
+    {
+        if( alpha > 125 )
+        {
+            if( alpha - val < 125 )
+                alpha = 125;
+            else
+                alpha -= val;
+            rend = 1;
+        }
+        else
+        {
+            if( alpha + val > 125 )
+                alpha = 125;
+            else
+                alpha += 125;
+            rend = 1;
+        }
+    }
+    if( !sichtbar && alpha != 0 )
+    {
+        if( alpha - val < 0 )
+            alpha = 0;
+        else
+            alpha -= val;
+        rend = 1;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
-void SpieleKaufen::render( Bild &zRObj )
+void SpieleKaufen::render( Bild & zRObj )
 {
-	if( !alpha )
-		return;
-	int br = ram->getBreite();
-	int hö = ram->getHeight();
-	if( !zRObj.setDrawOptions( pos.x, pos.y, br, hö ) )
-		return;
-	zRObj.setAlpha( alpha );
-	ram->render( zRObj );
-	suchFilterT->render( zRObj );
-	suchFilter->render( zRObj );
-	suchen->render( zRObj );
-	seiten->render( zRObj );
-	weiter->render( zRObj );
-	zurück->render( zRObj );
-	liste->render( zRObj );
-	auswahl->render( zRObj );
-	zRObj.releaseAlpha();
-	laden->render( zRObj );
-	zRObj.releaseDrawOptions();
+    if( !alpha )
+        return;
+    int br = ram->getBreite();
+    int hö = ram->getHeight();
+    if( !zRObj.setDrawOptions( pos.x, pos.y, br, hö ) )
+        return;
+    zRObj.setAlpha( alpha );
+    ram->render( zRObj );
+    suchFilterT->render( zRObj );
+    suchFilter->render( zRObj );
+    suchen->render( zRObj );
+    seiten->render( zRObj );
+    weiter->render( zRObj );
+    zurück->render( zRObj );
+    liste->render( zRObj );
+    auswahl->render( zRObj );
+    zRObj.releaseAlpha();
+    laden->render( zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 bool SpieleKaufen::istSichtbar() const
 {
-	return sichtbar;
+    return sichtbar;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *SpieleKaufen::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 1000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 4 - 0
KSGClient/NachLogin/Shop/Spiele/SpieleKaufen.h

@@ -39,6 +39,8 @@ public:
 	void doTastaturEreignis( TastaturEreignis &te );
 	bool tick( double zeit );
 	void render( Bild &zRObj );
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class SpieleKaufenListeEintrag
@@ -136,6 +138,8 @@ public:
 	void render( Bild &zRObj );
 	// constant
 	bool istSichtbar() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 13 - 4
KSGClient/NachLogin/Spiele/Gruppe/Gruppe.cpp

@@ -1844,10 +1844,6 @@ GruppeKarte::GruppeKarte( Schrift * zSchrift )
 // Destruktor
 GruppeKarte::~GruppeKarte()
 {
-    exit = 1;
-    warteAufThread( 5000 );
-    if( run )
-        ende();
     rahmen->release();
     if( info )
     {
@@ -2103,6 +2099,19 @@ int GruppeKarte::getKarteId() const
     return karteId;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *GruppeKarte::release()
+{
+    if( ref == 2 && run )
+    {
+        exit = 1;
+        warteAufThread( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
+}
+
 // Inhalt der GruppeSpielGefunden Klasse aus Gruppe.h
 // Konstruktor
 GruppeSpielGefunden::GruppeSpielGefunden( Schrift * zSchrift )

+ 2 - 0
KSGClient/NachLogin/Spiele/Gruppe/Gruppe.h

@@ -296,6 +296,8 @@ public:
 	virtual void thread();
 	// constant
 	int getKarteId() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class GruppeSpielGefunden

+ 11 - 0
KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.cpp

@@ -785,4 +785,15 @@ bool KarteAuswahlFenster::hatAuswahl() const
 KarteDaten *KarteAuswahlFenster::getAuswahl() const
 {
     return members->get( auswahl );
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *KarteAuswahlFenster::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.h

@@ -109,6 +109,8 @@ public:
     int getAnzahlAufSeite() const;
     bool hatAuswahl() const;
     KarteDaten *getAuswahl() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 11 - 5
KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.cpp

@@ -745,11 +745,6 @@ SpielAuswahlFenster::SpielAuswahlFenster( Schrift * zSchrift )
 // Destruktor
 SpielAuswahlFenster::~SpielAuswahlFenster()
 {
-    if( run )
-    {
-        warteAufThread( 5000 );
-        ende();
-    }
     if( schrift )
         schrift->release();
     if( rahmen )
@@ -1010,4 +1005,15 @@ SpielDaten *SpielAuswahlFenster::zAuswahl() const
 bool SpielAuswahlFenster::istAuswahlErlubt() const
 {
     return auswahl != -1 && members->z( auswahl )->istErlaubt();
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *SpielAuswahlFenster::release()
+{
+    if( ref == 2 && run )
+    {
+        warteAufThread( 5000 );
+        ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.h

@@ -118,6 +118,8 @@ public:
     SpielDaten *getAuswahl() const;
     SpielDaten *zAuswahl() const;
     bool istAuswahlErlubt() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 8 - 1
KSGClient/NachLogin/Titel/TitelLeiste.cpp

@@ -157,7 +157,6 @@ TitelLeiste::TitelLeiste( Fenster *zNachLogin, Schrift *zSchrift )
 // Destruktor
 TitelLeiste::~TitelLeiste()
 {
-    ende();
     if( closeBild )
         closeBild = closeBild->release();
     if( einstellungenBild )
@@ -663,6 +662,14 @@ int TitelLeiste::getSpielenX() const
     return spielen->getX();
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *TitelLeiste::release()
+{
+    if( ref == 2 && run )
+        ende();
+    return Thread::release();
+}
+
 // Ereignisse
 bool titelLeisteSchließenME( void *p, void *obj, MausEreignis me )
 {

+ 2 - 0
KSGClient/NachLogin/Titel/TitelLeiste.h

@@ -59,6 +59,8 @@ public:
 	bool tick(); // tick
 	// constant
 	int getSpielenX() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 // Ereignisse

+ 16 - 10
KSGClient/NachLogin/Update/Update.cpp

@@ -17,16 +17,6 @@ Update::Update( Schrift *zSchrift, FBalken *fb, int dg, std::function< void(bool
 // Destruktor
 Update::~Update()
 {
-	if( isRunning() )
-	{
-		updateAbbrechen = 1;
-		warteAufThread( 5000 );
-        if( isRunning() )
-        {
-            ende();
-            after( 0 );
-        }
-	}
     if( fb )
         fb->release();
 	if( p )
@@ -78,6 +68,22 @@ int Update::getDateiGruppe() const
     return dg;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *Update::release()
+{
+    if( ref == 2 && run )
+    {
+        updateAbbrechen = 1;
+        warteAufThread( 5000 );
+        if( isRunning() )
+        {
+            ende();
+            after( 0 );
+        }
+    }
+    return Thread::release();
+}
+
 
 // inhalt der UpdateHandler Klasse aus UpdateGUI.h
 // Konstruktor

+ 2 - 0
KSGClient/NachLogin/Update/Update.h

@@ -30,6 +30,8 @@ public:
     void threadEnd() override;
 	// constant
     int getDateiGruppe() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class UpdateHandler