Эх сурвалжийг харах

now uses Framework reference counting and ui initialisation

Kolja Strohm 3 жил өмнө
parent
commit
455785a0ea
52 өөрчлөгдсөн 2290 нэмэгдсэн , 3125 устгасан
  1. 8 34
      Linie/Aufzeichnung/Aufzeichnung.cpp
  2. 36 42
      Linie/Aufzeichnung/Aufzeichnung.h
  3. 22 113
      Linie/Aufzeichnung/Bestenliste/VideoBestenliste.cpp
  4. 97 108
      Linie/Aufzeichnung/Bestenliste/VideoBestenliste.h
  5. 3 24
      Linie/Aufzeichnung/Chat/VideoChat.cpp
  6. 14 19
      Linie/Aufzeichnung/Chat/VideoChat.h
  7. 3 20
      Linie/Aufzeichnung/Ende/VideoEnde.cpp
  8. 13 16
      Linie/Aufzeichnung/Ende/VideoEnde.h
  9. 53 68
      Linie/Aufzeichnung/Kamera/VideoKamera.cpp
  10. 29 33
      Linie/Aufzeichnung/Kamera/VideoKamera.h
  11. 29 44
      Linie/Aufzeichnung/Karte/VideoKarte.cpp
  12. 17 21
      Linie/Aufzeichnung/Karte/VideoKarte.h
  13. 2 32
      Linie/Aufzeichnung/Nachricht/VideoNachricht.cpp
  14. 53 61
      Linie/Aufzeichnung/Nachricht/VideoNachricht.h
  15. 1 16
      Linie/Aufzeichnung/Spieler/VideoSpieler.cpp
  16. 69 73
      Linie/Aufzeichnung/Spieler/VideoSpieler.h
  17. 167 169
      Linie/Aufzeichnung/Steuerung/VideoSteuerung.cpp
  18. 28 31
      Linie/Aufzeichnung/Steuerung/VideoSteuerung.h
  19. 9 33
      Linie/HistorieStatistik/HistorieStatistik.cpp
  20. 28 34
      Linie/HistorieStatistik/HistorieStatistik.h
  21. 355 370
      Linie/HistorieStatistik/StatistikLeser.cpp
  22. 24 28
      Linie/HistorieStatistik/StatistikLeser.h
  23. 0 215
      Linie/Initialisierung/Initialisierung.cpp
  24. 0 32
      Linie/Initialisierung/Initialisierung.h
  25. 0 2
      Linie/Linie.vcxproj
  26. 0 6
      Linie/Linie.vcxproj.filters
  27. 13 28
      Linie/Netzwerk/STKNachricht.cpp
  28. 18 20
      Linie/Netzwerk/STKNachricht.h
  29. 22 99
      Linie/Spiel/Bestenliste/Bestenliste.cpp
  30. 91 102
      Linie/Spiel/Bestenliste/Bestenliste.h
  31. 4 30
      Linie/Spiel/Chat/Chat.cpp
  32. 16 22
      Linie/Spiel/Chat/Chat.h
  33. 5 26
      Linie/Spiel/Ende/Ende.cpp
  34. 17 20
      Linie/Spiel/Ende/Ende.h
  35. 4 23
      Linie/Spiel/Ende/RundenEnde.cpp
  36. 17 20
      Linie/Spiel/Ende/RundenEnde.h
  37. 36 51
      Linie/Spiel/Kamera/Kamera.cpp
  38. 25 29
      Linie/Spiel/Kamera/Kamera.h
  39. 18 33
      Linie/Spiel/Karte/Karte.cpp
  40. 17 21
      Linie/Spiel/Karte/Karte.h
  41. 25 49
      Linie/Spiel/SpielKlasse.cpp
  42. 42 48
      Linie/Spiel/SpielKlasse.h
  43. 1 16
      Linie/Spiel/Spieler/Spieler.cpp
  44. 53 57
      Linie/Spiel/Spieler/Spieler.h
  45. 341 362
      Linie/SpielStatistik/Chat/StatistikChat.cpp
  46. 88 101
      Linie/SpielStatistik/Chat/StatistikChat.h
  47. 108 107
      Linie/SpielStatistik/Runde/StatistikRunde.cpp
  48. 23 26
      Linie/SpielStatistik/Runde/StatistikRunde.h
  49. 6 33
      Linie/SpielStatistik/SpielStatistik.cpp
  50. 43 49
      Linie/SpielStatistik/SpielStatistik.h
  51. 161 70
      Linie/SpielStatistik/Tabelle/StatistikTabelle.cpp
  52. 36 39
      Linie/SpielStatistik/Tabelle/StatistikTabelle.h

+ 8 - 34
Linie/Aufzeichnung/Aufzeichnung.cpp

@@ -5,11 +5,10 @@
 // Inhalt der Aufzeichnung Klasse auf Aufzeichnung.h
 // Konstruktor
 Aufzeichnung::Aufzeichnung()
+    : ReferenceCounter()
 {
     nMsg = 0;
     nMsgVorwärts = 0;
-    schrift = 0;
-    screen = 0;
     nachrichten = 0;
     bestenliste = 0;
     chat = 0;
@@ -29,14 +28,11 @@ Aufzeichnung::Aufzeichnung()
     geladen = 0;
     pauseZeit = -1;
     time = 0;
-    ref = 1;
 }
 
 // Destruktor
 Aufzeichnung::~Aufzeichnung()
 {
-    if( schrift )
-        schrift->release();
     spieler->release();
     if( ende )
         ende->release();
@@ -47,7 +43,7 @@ Aufzeichnung::~Aufzeichnung()
     if( steuerung )
         steuerung->release();
     if( chat )
-        chat->relese();
+        chat->release();
     if( bestenliste )
         bestenliste->release();
     if( nachrichten )
@@ -56,27 +52,20 @@ Aufzeichnung::~Aufzeichnung()
 }
 
 // nicht constant
-void Aufzeichnung::setSchrift( Schrift *schrift )
+void Aufzeichnung::setUIFactory( UIInit &factory )
 {
-    if( this->schrift )
-        this->schrift->release();
-    this->schrift = schrift;
-}
-
-void Aufzeichnung::setBildschirm( Bildschirm *zScreen )
-{
-    screen = zScreen;
+    uiFactory = factory;
 }
 
 bool Aufzeichnung::ladeSpiel( int id )
 {
     nachrichten = new SpielNachricht( id );
-    bestenliste = new VideoBestenliste( dynamic_cast<Schrift *>( schrift->getThis() ) );
-    chat = new VideoChat( schrift );
-    steuerung = new VideoSteuerung( schrift, screen );
+    bestenliste = new VideoBestenliste( uiFactory );
+    chat = new VideoChat( uiFactory );
+    steuerung = new VideoSteuerung( uiFactory );
     kam = new VideoKamera();
     map = new VideoKarte();
-    ende = new VideoEnde( schrift );
+    ende = new VideoEnde( uiFactory );
     Text f;
     if( nachrichten->hatFehler( &f ) )
     {
@@ -628,19 +617,4 @@ bool Aufzeichnung::hatVerlassen( bool jetzt ) const
     if( !geladen )
         return 0;
     return steuerung->istBeendet( jetzt );
-}
-
-// Reference Counting
-AufzeichnungV *Aufzeichnung::getThis()
-{
-    ref++;
-    return this;
-}
-
-AufzeichnungV *Aufzeichnung::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 36 - 42
Linie/Aufzeichnung/Aufzeichnung.h

@@ -12,50 +12,44 @@
 class Aufzeichnung : public AufzeichnungV
 {
 private:
-	Schrift *schrift;
-	Bildschirm *screen;
-	SpielNachricht *nachrichten;
-	VideoBestenliste *bestenliste;
-	VideoChat *chat;
-	VideoSteuerung *steuerung;
-	VideoKamera *kam;
-	VideoKarte *map;
-	VideoEnde *ende;
-	RCArray< VideoSpieler > *spieler;
-	VideoMSG *nMsg;
-	bool nMsgVorwärts;
-	Array< double > *rSpielZeit;
-	double pauseZeit;
-	double spielZeit;
-	double time;
-	bool spielPause;
-	int spielerAnzahl;
-	int teamAnzahl;
-	int kamSpielerNummer;
-	int mx;
-	int my;
-	bool geladen;
-	int ref;
+    UIInit uiFactory;
+    SpielNachricht *nachrichten;
+    VideoBestenliste *bestenliste;
+    VideoChat *chat;
+    VideoSteuerung *steuerung;
+    VideoKamera *kam;
+    VideoKarte *map;
+    VideoEnde *ende;
+    RCArray< VideoSpieler > *spieler;
+    VideoMSG *nMsg;
+    bool nMsgVorwärts;
+    Array< double > *rSpielZeit;
+    double pauseZeit;
+    double spielZeit;
+    double time;
+    bool spielPause;
+    int spielerAnzahl;
+    int teamAnzahl;
+    int kamSpielerNummer;
+    int mx;
+    int my;
+    bool geladen;
 
 public:
-	// Konstruktor
-	Aufzeichnung();
-	// Destruktor
-	~Aufzeichnung();
-	// nicht constant
-	void setSchrift( Schrift *schrift ) override;
-	void setBildschirm( Bildschirm *zScreen ) override;
-	bool ladeSpiel( int id ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	bool spielTick( double spielZeit );
-	bool tick( double tickVal ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	bool hatVerlassen( bool jetzt ) const override;
-	// Reference Counting
-	AufzeichnungV *getThis() override;
-	AufzeichnungV *release() override;
+    // Konstruktor
+    Aufzeichnung();
+    // Destruktor
+    ~Aufzeichnung();
+    // nicht constant
+    virtual void setUIFactory( UIInit &factory ) override;
+    bool ladeSpiel( int id ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    bool spielTick( double spielZeit );
+    bool tick( double tickVal ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    bool hatVerlassen( bool jetzt ) const override;
 };
 
 #endif

+ 22 - 113
Linie/Aufzeichnung/Bestenliste/VideoBestenliste.cpp

@@ -9,7 +9,8 @@
 
 // Inhalt der VideoBLSpieler Klasse aus VideoBestenliste.h
 // Konstruktor
-VideoBLSpieler::VideoBLSpieler( int sNum, int farbe, Schrift *zS )
+VideoBLSpieler::VideoBLSpieler( int sNum, int farbe, UIInit &uiFactory )
+    : ReferenceCounter()
 {
     this->sNum = sNum;
     this->farbe = farbe;
@@ -21,50 +22,36 @@ VideoBLSpieler::VideoBLSpieler( int sNum, int farbe, Schrift *zS )
     rahmen->setRamenBreite( 1 );
     rahmen->setSize( 400, 20 );
 
-    name = new TextFeld();
+    name = uiFactory.createTextFeld( uiFactory.initParam );
     name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( zS )
-        name->setSchriftZ( dynamic_cast<Schrift *>( zS->getThis() ) );
     name->setSchriftFarbe( farbe );
-    name->setSchriftSize( 12 );
     name->setSize( 100, 20 );
     name->setPosition( 0, 0 );
     name->setText( "" );
 
-    punkte = new TextFeld();
+    punkte = uiFactory.createTextFeld( uiFactory.initParam );
     punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( zS )
-        punkte->setSchriftZ( dynamic_cast<Schrift *>( zS->getThis() ) );
     punkte->setSchriftFarbe( farbe );
-    punkte->setSchriftSize( 12 );
     punkte->setSize( 100, 20 );
     punkte->setPosition( 100, 0 );
     punkte->setText( "" );
 
-    neuPunkte = new TextFeld();
+    neuPunkte = uiFactory.createTextFeld( uiFactory.initParam );
     neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( zS )
-        neuPunkte->setSchriftZ( dynamic_cast<Schrift *>( zS->getThis() ) );
     neuPunkte->setSchriftFarbe( farbe );
-    neuPunkte->setSchriftSize( 12 );
     neuPunkte->setSize( 100, 20 );
     neuPunkte->setPosition( 200, 0 );
     neuPunkte->setText( "" );
 
-    status = new TextFeld();
+    status = uiFactory.createTextFeld( uiFactory.initParam );
     status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( zS )
-        status->setSchriftZ( dynamic_cast<Schrift *>( zS->getThis() ) );
     status->setSchriftFarbe( 0xFF00FF00 );
-    status->setSchriftSize( 12 );
     status->setSize( 100, 20 );
     status->setPosition( 300, 0 );
     status->setText( "lebt" );
 
     rundenNP = new Array< int >();
     runde = 0;
-
-    ref = 1;
 }
 
 // Destruktor
@@ -168,24 +155,10 @@ int VideoBLSpieler::getPunkte() const
     return p + nP;
 }
 
-// Reference Counting
-VideoBLSpieler *VideoBLSpieler::getThis()
-{
-    ref++;
-    return this;
-}
-
-VideoBLSpieler *VideoBLSpieler::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der VideoBLTeam Klasse aus VideoBestenliste.h
 // Konstruktor
-VideoBLTeam::VideoBLTeam( int id, int farbe, Schrift *s, char *n )
+VideoBLTeam::VideoBLTeam( int id, int farbe, UIInit &uiFactory, char *n )
+    : ReferenceCounter()
 {
     teamId = id;
     spielerAnzahl = 0;
@@ -193,7 +166,7 @@ VideoBLTeam::VideoBLTeam( int id, int farbe, Schrift *s, char *n )
     mP = 0;
     nP = 0;
     this->farbe = farbe;
-    schrift = s;
+    this->uiFactory = uiFactory;
 
     rahmen = new LRahmen();
     rahmen->setFarbe( farbe );
@@ -201,57 +174,41 @@ VideoBLTeam::VideoBLTeam( int id, int farbe, Schrift *s, char *n )
 
     spieler = new RCArray< VideoBLSpieler >();
 
-    name = new TextFeld();
+    name = uiFactory.createTextFeld( uiFactory.initParam );
     name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( s )
-        name->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
     name->setSchriftFarbe( farbe );
-    name->setSchriftSize( 12 );
     name->setSize( 100, 20 );
     name->setPosition( 0, 0 );
     name->setText( n );
 
-    punkte = new TextFeld();
+    punkte = uiFactory.createTextFeld( uiFactory.initParam );
     punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( s )
-        punkte->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
     punkte->setSchriftFarbe( farbe );
-    punkte->setSchriftSize( 12 );
     punkte->setSize( 100, 20 );
     punkte->setPosition( 100, 0 );
     punkte->setText( "" );
 
-    neuPunkte = new TextFeld();
+    neuPunkte = uiFactory.createTextFeld( uiFactory.initParam );
     neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( s )
-        neuPunkte->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
     neuPunkte->setSchriftFarbe( farbe );
-    neuPunkte->setSchriftSize( 12 );
     neuPunkte->setSize( 100, 20 );
     neuPunkte->setPosition( 200, 0 );
     neuPunkte->setText( "" );
 
-    status = new TextFeld();
+    status = uiFactory.createTextFeld( uiFactory.initParam );
     status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( s )
-        status->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
     status->setSchriftFarbe( 0xFF00FF00 );
-    status->setSchriftSize( 12 );
     status->setSize( 100, 20 );
     status->setPosition( 300, 0 );
     status->setText( "lebt" );
 
     rundenNP = new Array< int >();
     runde = 0;
-
-    ref = 1;
 }
 
 // Destruktor
 VideoBLTeam::~VideoBLTeam()
 {
-    if( schrift )
-        schrift->release();
     rahmen->release();
     spieler->release();
     name->release();
@@ -275,7 +232,7 @@ bool VideoBLTeam::addSpieler( VideoSpieler *zSpieler )
     }
     if( gefunden )
         return 0;
-    VideoBLSpieler *tmp = new VideoBLSpieler( zSpieler->getSpielerNummer(), zSpieler->getFarbe(), schrift );
+    VideoBLSpieler *tmp = new VideoBLSpieler( zSpieler->getSpielerNummer(), zSpieler->getFarbe(), uiFactory );
     spieler->set( tmp, spielerAnzahl );
     spielerAnzahl++;
     return 1;
@@ -458,24 +415,10 @@ int VideoBLTeam::getSpielerPunkte( int sNum ) const
     return 0;
 }
 
-// Reference Counting
-VideoBLTeam *VideoBLTeam::getThis()
-{
-    ref++;
-    return this;
-}
-
-VideoBLTeam *VideoBLTeam::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der VideoBestenliste Klasse aus VideoBestenliste.h
 // Konstruktor
-VideoBestenliste::VideoBestenliste( Schrift *s )
+VideoBestenliste::VideoBestenliste( UIInit &uiFactory )
+    : ReferenceCounter()
 {
     rahmen = new LRahmen();
     rahmen->setRamenBreite( 1 );
@@ -484,42 +427,26 @@ VideoBestenliste::VideoBestenliste( Schrift *s )
 
     teams = new RCArray< VideoBLTeam >();
 
-    name = new TextFeld();
+    name = uiFactory.createTextFeld( uiFactory.initParam );
     name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( s )
-        name->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
-    name->setSchriftFarbe( 0xFFFFFFFF );
-    name->setSchriftSize( 12 );
     name->setText( "Name" );
     name->setSize( 100, 20 );
     name->setPosition( 0, 0 );
 
-    punkte = new TextFeld();
+    punkte = uiFactory.createTextFeld( uiFactory.initParam );
     punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( s )
-        punkte->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
-    punkte->setSchriftFarbe( 0xFFFFFFFF );
-    punkte->setSchriftSize( 12 );
     punkte->setText( "Punkte" );
     punkte->setSize( 100, 20 );
     punkte->setPosition( 100, 0 );
 
-    neuPunkte = new TextFeld();
+    neuPunkte = uiFactory.createTextFeld( uiFactory.initParam );
     neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( s )
-        neuPunkte->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
-    neuPunkte->setSchriftFarbe( 0xFFFFFFFF );
-    neuPunkte->setSchriftSize( 12 );
     neuPunkte->setText( "+Punkte" );
     neuPunkte->setSize( 100, 20 );
     neuPunkte->setPosition( 200, 0 );
 
-    status = new TextFeld();
+    status = uiFactory.createTextFeld( uiFactory.initParam );
     status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    if( s )
-        status->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
-    status->setSchriftFarbe( 0xFFFFFFFF );
-    status->setSchriftSize( 12 );
     status->setText( "Status" );
     status->setSize( 100, 20 );
     status->setPosition( 300, 0 );
@@ -527,10 +454,9 @@ VideoBestenliste::VideoBestenliste( Schrift *s )
     scroll = new VScrollBar();
     scroll->setKlickScroll( 7 );
 
-    schrift = s;
+    this->uiFactory = uiFactory;
     update = 0;
     teamAnzahl = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -543,8 +469,6 @@ VideoBestenliste::~VideoBestenliste()
     neuPunkte->release();
     status->release();
     scroll->release();
-    if( schrift )
-        schrift->release();
 }
 
 // nicht constant
@@ -565,7 +489,7 @@ void VideoBestenliste::addSpieler( VideoSpieler *zSpieler )
     if( team < 0 )
         return;
     if( !teams->z( team ) )
-        teams->set( new VideoBLTeam( team, zSpieler->getTeamFarbe(), schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0, zSpieler->zTeamName()->getText() ), team );
+        teams->set( new VideoBLTeam( team, zSpieler->getTeamFarbe(), uiFactory, zSpieler->zTeamName()->getText() ), team );
     teams->z( team )->addSpieler( zSpieler );
 }
 
@@ -696,19 +620,4 @@ int VideoBestenliste::getSpielerPunkte( int team, int sNum ) const
     if( !teams->z( team ) )
         return 0;
     return teams->z( team )->getSpielerPunkte( sNum );
-}
-
-// Reference Counting
-VideoBestenliste *VideoBestenliste::getThis()
-{
-    ref++;
-    return this;
-}
-
-VideoBestenliste *VideoBestenliste::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 97 - 108
Linie/Aufzeichnung/Bestenliste/VideoBestenliste.h

@@ -3,135 +3,124 @@
 
 #include <TextFeld.h>
 #include <Array.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
 class VideoSpieler; // VideoSpieler.h
 
-class VideoBLSpieler
+class VideoBLSpieler : public virtual ReferenceCounter
 {
 private:
-	int sNum;
-	int farbe;
-	int p;
-	int nP;
-	Rahmen *rahmen;
-	TextFeld *name;
-	TextFeld *punkte;
-	TextFeld *neuPunkte;
-	TextFeld *status;
-	Array< int > *rundenNP;
-	int runde;
-	int ref;
+    int sNum;
+    int farbe;
+    int p;
+    int nP;
+    Rahmen *rahmen;
+    TextFeld *name;
+    TextFeld *punkte;
+    TextFeld *neuPunkte;
+    TextFeld *status;
+    Array< int > *rundenNP;
+    int runde;
 
 public:
-	// Konstruktor
-	VideoBLSpieler( int sNum, int farbe, Schrift *zS );
-	// Destruktor
-	~VideoBLSpieler();
-	// nicht constant
-	bool updateStatus( VideoSpieler *zSpieler );
-	void setPunkte( int p );
-	void addPunkt( bool plus );
-	void updatePunkte( bool vorwärts );
-	void render( int y, Bild &zRObj );
-	// constant
-	int getSpielerNummer() const;
-	int getPunkte() const;
-	// Reference Counting
-	VideoBLSpieler *getThis();
-	VideoBLSpieler *release();
+    // Konstruktor
+    VideoBLSpieler( int sNum, int farbe, UIInit &uiFactory );
+    // Destruktor
+    ~VideoBLSpieler();
+    // nicht constant
+    bool updateStatus( VideoSpieler *zSpieler );
+    void setPunkte( int p );
+    void addPunkt( bool plus );
+    void updatePunkte( bool vorwärts );
+    void render( int y, Bild &zRObj );
+    // constant
+    int getSpielerNummer() const;
+    int getPunkte() const;
 };
 
-class VideoBLTeam
+class VideoBLTeam : public virtual ReferenceCounter
 {
 private:
-	int teamId;
-	int spielerAnzahl;
-	int p;
-	int mP;
-	int nP;
-	int farbe;
-	Schrift *schrift;
-	Rahmen *rahmen;
-	RCArray< VideoBLSpieler > *spieler;
-	TextFeld *name;
-	TextFeld *punkte;
-	TextFeld *neuPunkte;
-	TextFeld *status;
-	Array< int > *rundenNP;
-	int runde;
-	int ref;
+    int teamId;
+    int spielerAnzahl;
+    int p;
+    int mP;
+    int nP;
+    int farbe;
+    UIInit uiFactory;
+    Rahmen *rahmen;
+    RCArray< VideoBLSpieler > *spieler;
+    TextFeld *name;
+    TextFeld *punkte;
+    TextFeld *neuPunkte;
+    TextFeld *status;
+    Array< int > *rundenNP;
+    int runde;
 
 public:
-	// Konstruktor
-	VideoBLTeam( int id, int farbe, Schrift *s, char *n );
-	// Destruktor
-	~VideoBLTeam();
-	// nicht constant
-	bool addSpieler( VideoSpieler *zSpieler );
-	bool updateSpielerStatus( VideoSpieler *zSpieler );
-	void setStatus( const char *txt, int f );
-	void setPunkte( int p );
-	void setMaxPunkte( int mP );
-	bool setSpielerPunkte( int sNum, int p );
-	void addPunkt( bool plus );
-	bool addPunkt( int sNum, bool plus );
-	void updatePunkte( bool vorwärts );
-	void render( int y, Bild &zRObj );
-	// constant
-	int getSpielerAnzahl() const;
-	int getPunkte() const;
-	int getHeight() const;
-	bool hatGewonnen() const;
-	int getSpielerPunkte( int sNum ) const;
-	// Reference Counting
-	VideoBLTeam *getThis();
-	VideoBLTeam *release();
+    // Konstruktor
+    VideoBLTeam( int id, int farbe, UIInit &uiFactory, char *n );
+    // Destruktor
+    ~VideoBLTeam();
+    // nicht constant
+    bool addSpieler( VideoSpieler *zSpieler );
+    bool updateSpielerStatus( VideoSpieler *zSpieler );
+    void setStatus( const char *txt, int f );
+    void setPunkte( int p );
+    void setMaxPunkte( int mP );
+    bool setSpielerPunkte( int sNum, int p );
+    void addPunkt( bool plus );
+    bool addPunkt( int sNum, bool plus );
+    void updatePunkte( bool vorwärts );
+    void render( int y, Bild &zRObj );
+    // constant
+    int getSpielerAnzahl() const;
+    int getPunkte() const;
+    int getHeight() const;
+    bool hatGewonnen() const;
+    int getSpielerPunkte( int sNum ) const;
 };
 
-class VideoBestenliste
+class VideoBestenliste : public virtual ReferenceCounter
 {
 private:
-	Rahmen *rahmen;
-	RCArray< VideoBLTeam > *teams;
-	TextFeld *name;
-	TextFeld *punkte;
-	TextFeld *neuPunkte;
-	TextFeld *status;
-	VScrollBar *scroll;
-	Schrift *schrift;
-	bool update;
-	int teamAnzahl;
-	int ref;
+    Rahmen *rahmen;
+    RCArray< VideoBLTeam > *teams;
+    TextFeld *name;
+    TextFeld *punkte;
+    TextFeld *neuPunkte;
+    TextFeld *status;
+    VScrollBar *scroll;
+    UIInit uiFactory;
+    bool update;
+    int teamAnzahl;
 
 public:
-	// Konstruktor
-	VideoBestenliste( Schrift *s );
-	// Destruktor
-	~VideoBestenliste();
-	// nicht constant
-	void setTeamAnzahl( int anz );
-	void addSpieler( VideoSpieler *zSpieler );
-	void updateSpielerStatus( VideoSpieler *zSpieler );
-	void setTeamStatus( int team, const char *txt, int f );
-	void setTeamPunkte( int teamId, int punkte );
-	void setTeamMaxPunkte( int teamId, int mPunkte );
-	void setSpielerPunkte( int teamNum, int sNum, int punkte );
-	void addPunkt( int tNum, bool plus );
-	void addPunkt( int tNum, int sNum, bool plus );
-	void updatePunkte( bool vorwärts = 1 );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	int getTeamAnzahl() const;
-	bool teamExistiert( int team ) const;
-	int getTeamPunkte( int team ) const;
-	bool hatTeamGewonnen( int team ) const;
-	int getSpielerPunkte( int team, int sNum ) const;
-	// Reference Counting
-	VideoBestenliste *getThis();
-	VideoBestenliste *release();
+    // Konstruktor
+    VideoBestenliste( UIInit &uiFactory );
+    // Destruktor
+    ~VideoBestenliste();
+    // nicht constant
+    void setTeamAnzahl( int anz );
+    void addSpieler( VideoSpieler *zSpieler );
+    void updateSpielerStatus( VideoSpieler *zSpieler );
+    void setTeamStatus( int team, const char *txt, int f );
+    void setTeamPunkte( int teamId, int punkte );
+    void setTeamMaxPunkte( int teamId, int mPunkte );
+    void setSpielerPunkte( int teamNum, int sNum, int punkte );
+    void addPunkt( int tNum, bool plus );
+    void addPunkt( int tNum, int sNum, bool plus );
+    void updatePunkte( bool vorwärts = 1 );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    int getTeamAnzahl() const;
+    bool teamExistiert( int team ) const;
+    int getTeamPunkte( int team ) const;
+    bool hatTeamGewonnen( int team ) const;
+    int getSpielerPunkte( int team, int sNum ) const;
 };
 
 #endif

+ 3 - 24
Linie/Aufzeichnung/Chat/VideoChat.cpp

@@ -9,19 +9,15 @@
 
 // Inhalt der VideoChat Klasse aus VideoChat.h
 // Konstruktor
-VideoChat::VideoChat( Schrift *zSchrift )
+VideoChat::VideoChat( UIInit &uiFactory )
+    : ReferenceCounter()
 {
-    verlauf = new TextFeld();
+    verlauf = uiFactory.createTextFeld( uiFactory.initParam );
     verlauf->setStyle( TextFeld::Style::TextGebiet & ~TextFeld::Style::Erlaubt );
     verlauf->setRahmenFarbe( 0xFF909090 );
-    verlauf->setRahmenBreite( 1 );
     verlauf->setText( "" );
-    verlauf->setSchriftFarbe( 0xFFFFFFFF );
-    verlauf->setSchriftSize( 12 );
     verlauf->setPosition( 20, BildschirmGröße().y - 210 );
     verlauf->setSize( 450, 200 );
-    verlauf->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
-    ref = 1;
 }
 
 // Destruktor
@@ -86,21 +82,4 @@ void VideoChat::tick( double z )
 void VideoChat::render( Bild &zRObj )
 {
     verlauf->render( zRObj );
-}
-
-// constant
-
-// Reference Counting
-VideoChat *VideoChat::getThis()
-{
-    ref++;
-    return this;
-}
-
-VideoChat *VideoChat::relese()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 14 - 19
Linie/Aufzeichnung/Chat/VideoChat.h

@@ -2,32 +2,27 @@
 #define VideoChat_H
 
 #include <TextFeld.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
-class VideoChat
+class VideoChat : public virtual ReferenceCounter
 {
 private:
-	TextFeld *verlauf;
-	int ref;
+    TextFeld *verlauf;
 
 public:
-	// Konstruktor
-	VideoChat( Schrift *zSchrift );
-	// Destruktor
-	~VideoChat();
-	// nicht constant
-	void addNachricht( char *nachricht );
-	void addNachricht( char *nachricht, int farbe );
-	void removeNachricht( char *nachricht );
-	void doPublicMausEreignis( MausEreignis &me );
-	void tick( double z );
-	void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	VideoChat *getThis();
-	VideoChat *relese();
+    // Konstruktor
+    VideoChat( UIInit &uiFactory );
+    // Destruktor
+    ~VideoChat();
+    // nicht constant
+    void addNachricht( char *nachricht );
+    void addNachricht( char *nachricht, int farbe );
+    void removeNachricht( char *nachricht );
+    void doPublicMausEreignis( MausEreignis &me );
+    void tick( double z );
+    void render( Bild &zRObj );
 };
 
 #endif

+ 3 - 20
Linie/Aufzeichnung/Ende/VideoEnde.cpp

@@ -7,19 +7,17 @@
 
 // Inhalt der VideoEnde Klasse aus VideoEnde.h
 // Konstruktor
-VideoEnde::VideoEnde( Schrift *zSchrift )
+VideoEnde::VideoEnde( UIInit &uiFactory )
+    : ReferenceCounter()
 {
-    text = new TextFeld();
+    text = uiFactory.createTextFeld( uiFactory.initParam );
     text->setStyle( TextFeld::Style::Text | TextFeld::Style::Center | TextFeld::Style::Rahmen | TextFeld::Style::Hintergrund | TextFeld::Style::HAlpha );
     text->removeStyle( TextFeld::Style::Sichtbar );
-    text->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
     text->setText( "" );
-    text->setSchriftFarbe( 0xFFFFFFFF );
     text->setSize( 220, 70 );
     text->setRahmenBreite( 2 );
     text->setRahmenFarbe( 0xFFFFFFFF );
     text->setHintergrundFarbe( 0xA0000000 );
-    ref = 1;
 }
 
 // Destruktor
@@ -52,19 +50,4 @@ void VideoEnde::render( Bild &zRObj )
 bool VideoEnde::istSichtbar() const
 {
     return text->hatStyle( TextFeld::Style::Sichtbar );
-}
-
-// Reference Counting
-VideoEnde *VideoEnde::getThis()
-{
-    ref++;
-    return this;
-}
-
-VideoEnde *VideoEnde::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 13 - 16
Linie/Aufzeichnung/Ende/VideoEnde.h

@@ -2,29 +2,26 @@
 #define VideoEnde_H
 
 #include <TextFeld.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
-class VideoEnde
+class VideoEnde : public virtual ReferenceCounter
 {
 private:
-	TextFeld *text;
-	int ref;
+    TextFeld *text;
 
 public:
-	// Konstruktor
-	VideoEnde( Schrift *zSchrift );
-	// Destruktor
-	~VideoEnde();
-	// nicht constant
-	void setSichtbar( bool b );
-	void setText( const char *txt );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-	// Reference Counting
-	VideoEnde *getThis();
-	VideoEnde *release();
+    // Konstruktor
+    VideoEnde( UIInit &uiFactory );
+    // Destruktor
+    ~VideoEnde();
+    // nicht constant
+    void setSichtbar( bool b );
+    void setText( const char *txt );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
 };
 
 #endif

+ 53 - 68
Linie/Aufzeichnung/Kamera/VideoKamera.cpp

@@ -6,140 +6,125 @@
 // Inhalt der VideoKamera Klasse aus VideoKamera.h
 // Konstruktor
 VideoKamera::VideoKamera()
+    : ReferenceCounter()
 {
-	pos = Punkt( 0, 0 );
-	gr = Punkt( 0, 0 );
-	runde = 0;
-	rundePos = new Array< Punkt >();
-	rundeGr = new Array< Punkt >();
-	rGr = Punkt( 0, 0 );
-	rahmen = new LRahmen();
-	rahmen->setFarbe( 0xFF505050 );
-	rahmen->setRamenBreite( 1 );
-	ref = 1;
+    pos = Punkt( 0, 0 );
+    gr = Punkt( 0, 0 );
+    runde = 0;
+    rundePos = new Array< Punkt >();
+    rundeGr = new Array< Punkt >();
+    rGr = Punkt( 0, 0 );
+    rahmen = new LRahmen();
+    rahmen->setFarbe( 0xFF505050 );
+    rahmen->setRamenBreite( 1 );
 }
 
 // Destruktor
 VideoKamera::~VideoKamera()
 {
-	rundePos->release();
-	rundeGr->release();
-	rahmen->release();
+    rundePos->release();
+    rundeGr->release();
+    rahmen->release();
 }
 
 // nicht constant
 void VideoKamera::setPosition( int x, int y )
 {
-	pos.x = x;
-	pos.y = y;
+    pos.x = x;
+    pos.y = y;
 }
 
 void VideoKamera::addPosition( int x, int y, VideoKarte *zMap )
 {
-	pos.x += x;
-	pos.y += y;
-	if( pos.x < 0 )
-		pos.x = 0;
-	if( pos.y < 0 )
-		pos.y = 0;
-	if( pos.x > zMap->getBreite() )
-		pos.x = zMap->getBreite();
-	if( pos.y > zMap->getHeight() )
-		pos.y = zMap->getHeight();
+    pos.x += x;
+    pos.y += y;
+    if( pos.x < 0 )
+        pos.x = 0;
+    if( pos.y < 0 )
+        pos.y = 0;
+    if( pos.x > zMap->getBreite() )
+        pos.x = zMap->getBreite();
+    if( pos.y > zMap->getHeight() )
+        pos.y = zMap->getHeight();
 }
 
 void VideoKamera::setSize( int br, int hö )
 {
-	gr.x = br;
-	gr.y = hö;
+    gr.x = br;
+    gr.y = hö;
 }
 
 void VideoKamera::render( Bild &zRObj )
 {
-	rGr = zRObj.getSize();
-	rahmen->setPosition( getRX( getLinks() ), getRY( getOben() ) );
-	rahmen->setSize( gr );
-	rahmen->render( zRObj );
+    rGr = zRObj.getSize();
+    rahmen->setPosition( getRX( getLinks() ), getRY( getOben() ) );
+    rahmen->setSize( gr );
+    rahmen->render( zRObj );
 }
 
 void VideoKamera::nextRunde( bool vorwärts )
 {
-	if( vorwärts )
-	{
-		rundePos->set( pos, runde );
-		rundeGr->set( gr, runde );
-		runde++;
-	}
-	else
-	{
-		runde--;
-		pos = rundePos->hat( runde ) ? rundePos->get( runde ) : Punkt( 0, 0 );
-		gr = rundeGr->hat( runde ) ? rundeGr->get( runde ) : Punkt( 0, 0 );
-	}
+    if( vorwärts )
+    {
+        rundePos->set( pos, runde );
+        rundeGr->set( gr, runde );
+        runde++;
+    }
+    else
+    {
+        runde--;
+        pos = rundePos->hat( runde ) ? rundePos->get( runde ) : Punkt( 0, 0 );
+        gr = rundeGr->hat( runde ) ? rundeGr->get( runde ) : Punkt( 0, 0 );
+    }
 }
 
 // constant
 int VideoKamera::getLinks() const
 {
-	return pos.x - (int)( gr.x / 2.0 + 0.5 );
+    return pos.x - (int)( gr.x / 2.0 + 0.5 );
 }
 
 int VideoKamera::getOben() const
 {
-	return pos.y - gr.y / 2;
+    return pos.y - gr.y / 2;
 }
 
 int VideoKamera::getRechts() const
 {
-	return pos.x + gr.x / 2;
+    return pos.x + gr.x / 2;
 }
 
 int VideoKamera::getUnten() const
 {
-	return pos.y + gr.y / 2;
+    return pos.y + gr.y / 2;
 }
 
 bool VideoKamera::istSichtbar( int x, int y ) const
 {
-	return ( x >= getLinks() && x < getRechts() && y >= getOben() && y < getUnten() );
+    return ( x >= getLinks() && x < getRechts() && y >= getOben() && y < getUnten() );
 }
 
 bool VideoKamera::istMausIn( int x, int y ) const
 {
-	return ( x >= ( rGr.x / 2 - gr.x / 2 ) && x < ( rGr.x / 2 + gr.x / 2 ) && y >= ( rGr.y / 2 - gr.y / 2 ) && y < ( rGr.y / 2 + gr.y / 2 ) );
+    return ( x >= ( rGr.x / 2 - gr.x / 2 ) && x < ( rGr.x / 2 + gr.x / 2 ) && y >= ( rGr.y / 2 - gr.y / 2 ) && y < ( rGr.y / 2 + gr.y / 2 ) );
 }
 
 int VideoKamera::getRX( int mapX ) const
 {
-	return rGr.x / 2 - ( pos.x - mapX );
+    return rGr.x / 2 - ( pos.x - mapX );
 }
 
 int VideoKamera::getRY( int mapY ) const
 {
-	return rGr.y / 2 - ( pos.y - mapY );
+    return rGr.y / 2 - ( pos.y - mapY );
 }
 
 int VideoKamera::getX() const
 {
-	return pos.x;
+    return pos.x;
 }
 
 int VideoKamera::getY() const
 {
-	return pos.y;
-}
-
-// Reference Counting
-VideoKamera *VideoKamera::getThis()
-{
-	ref++;
-	return this;
-}
-
-VideoKamera *VideoKamera::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return pos.y;
 }

+ 29 - 33
Linie/Aufzeichnung/Kamera/VideoKamera.h

@@ -3,43 +3,39 @@
 
 #include "../Karte/VideoKarte.h"
 
-class VideoKamera
+class VideoKamera : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	int runde;
-	Array< Punkt > *rundePos;
-	Array< Punkt > *rundeGr;
-	Punkt rGr;
-	Rahmen *rahmen;
-	int ref;
+    Punkt pos;
+    Punkt gr;
+    int runde;
+    Array< Punkt > *rundePos;
+    Array< Punkt > *rundeGr;
+    Punkt rGr;
+    Rahmen *rahmen;
 
 public:
-	// Konstruktor
-	VideoKamera();
-	// Destruktor
-	~VideoKamera();
-	// nicht constant
-	void setPosition( int x, int y );
-	void addPosition( int x, int y, VideoKarte *zMap );
-	void setSize( int br, int hö );
-	void render( Bild &zRObj );
-	void nextRunde( bool vorwärts );
-	// constant
-	int getLinks() const;
-	int getOben() const;
-	int getRechts() const;
-	int getUnten() const;
-	bool istSichtbar( int x, int y ) const;
-	bool istMausIn( int x, int y ) const;
-	int getRX( int mapX ) const;
-	int getRY( int mapY ) const;
-	int getX() const;
-	int getY() const;
-	// Reference Counting
-	VideoKamera *release();
-	VideoKamera *getThis();
+    // Konstruktor
+    VideoKamera();
+    // Destruktor
+    ~VideoKamera();
+    // nicht constant
+    void setPosition( int x, int y );
+    void addPosition( int x, int y, VideoKarte *zMap );
+    void setSize( int br, int hö );
+    void render( Bild &zRObj );
+    void nextRunde( bool vorwärts );
+    // constant
+    int getLinks() const;
+    int getOben() const;
+    int getRechts() const;
+    int getUnten() const;
+    bool istSichtbar( int x, int y ) const;
+    bool istMausIn( int x, int y ) const;
+    int getRX( int mapX ) const;
+    int getRY( int mapY ) const;
+    int getX() const;
+    int getY() const;
 };
 
 #endif

+ 29 - 44
Linie/Aufzeichnung/Karte/VideoKarte.cpp

@@ -6,84 +6,69 @@
 // Inhalt der VideoKarte Klasse aus VideoKarte.h
 // Konstruktor
 VideoKarte::VideoKarte()
+    : ReferenceCounter()
 {
-	map = new RCArray< Bild >();
-	rahmen = new RCArray< Rahmen >();
-	runde = 0;
-	map->set( new Bild(), runde );
-	rahmen->set( new Rahmen(), runde );
-	rahmen->z( runde )->setFarbe( 0xFFFFFFFF );
-	rahmen->z( runde )->setRamenBreite( 2 );
-	ref = 1;
+    map = new RCArray< Bild >();
+    rahmen = new RCArray< Rahmen >();
+    runde = 0;
+    map->set( new Bild(), runde );
+    rahmen->set( new Rahmen(), runde );
+    rahmen->z( runde )->setFarbe( 0xFFFFFFFF );
+    rahmen->z( runde )->setRamenBreite( 2 );
 }
 
 // Destruktor
 VideoKarte::~VideoKarte()
 {
-	map->release();
-	rahmen->release();
+    map->release();
+    rahmen->release();
 }
 
 // nicht constant
 void VideoKarte::setSize( int br, int hö )
 {
-	map->z( runde )->neuBild( br, hö, 0 );
-	rahmen->z( runde )->setSize( br, hö );
+    map->z( runde )->neuBild( br, hö, 0 );
+    rahmen->z( runde )->setSize( br, hö );
 }
 
 void VideoKarte::nextRunde( bool vorwärts )
 {
-	if( vorwärts )
-	{
-		runde++;
-		map->set( new Bild(), runde );
-		rahmen->set( new LRahmen(), runde );
-		rahmen->z( runde )->setFarbe( 0xFFFFFFFF );
-		rahmen->z( runde )->setRamenBreite( 2 );
-	}
-	else
-		runde--;
+    if( vorwärts )
+    {
+        runde++;
+        map->set( new Bild(), runde );
+        rahmen->set( new LRahmen(), runde );
+        rahmen->z( runde )->setFarbe( 0xFFFFFFFF );
+        rahmen->z( runde )->setRamenBreite( 2 );
+    }
+    else
+        runde--;
 }
 
 void VideoKarte::render( VideoKamera *zKam, Bild &zRObj )
 {
-	rahmen->z( runde )->setPosition( zKam->getRX( 0 ), zKam->getRY( 0 ) );
-	zRObj.drawBild( rahmen->z( runde )->getX(), rahmen->z( runde )->getY(), map->z( runde )->getBreite(), map->z( runde )->getHeight(), *map->z( runde ) );
-	rahmen->z( runde )->render( zRObj );
+    rahmen->z( runde )->setPosition( zKam->getRX( 0 ), zKam->getRY( 0 ) );
+    zRObj.drawBild( rahmen->z( runde )->getX(), rahmen->z( runde )->getY(), map->z( runde )->getBreite(), map->z( runde )->getHeight(), *map->z( runde ) );
+    rahmen->z( runde )->render( zRObj );
 }
 
 // constant
 int VideoKarte::getBreite() const
 {
-	return map->z( runde )->getBreite();
+    return map->z( runde )->getBreite();
 }
 
 int VideoKarte::getHeight() const
 {
-	return map->z( runde )->getHeight();
+    return map->z( runde )->getHeight();
 }
 
 Bild *VideoKarte::zMap() const
 {
-	return ( map->z( runde )->getBreite() != 0 && map->z( runde )->getHeight() != 0 ) ? map->z( runde ) : 0;
+    return ( map->z( runde )->getBreite() != 0 && map->z( runde )->getHeight() != 0 ) ? map->z( runde ) : 0;
 }
 
 Bild *VideoKarte::zMap( int runde ) const
 {
-	return ( map->z( runde )->getBreite() != 0 && map->z( runde )->getHeight() != 0 ) ? map->z( runde ) : 0;
-}
-
-// Reference Counting
-VideoKarte *VideoKarte::getThis()
-{
-	ref++;
-	return this;
-}
-
-VideoKarte *VideoKarte::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return ( map->z( runde )->getBreite() != 0 && map->z( runde )->getHeight() != 0 ) ? map->z( runde ) : 0;
 }

+ 17 - 21
Linie/Aufzeichnung/Karte/VideoKarte.h

@@ -7,31 +7,27 @@ using namespace Framework;
 
 class VideoKamera;
 
-class VideoKarte
+class VideoKarte : public virtual ReferenceCounter
 {
 private:
-	RCArray< Rahmen > *rahmen;
-	RCArray< Bild > *map;
-	int runde;
-	int ref;
+    RCArray< Rahmen > *rahmen;
+    RCArray< Bild > *map;
+    int runde;
 
 public:
-	// Konstruktor
-	VideoKarte();
-	// Destruktor
-	~VideoKarte();
-	// nicht constant
-	void setSize( int br, int hö );
-	void nextRunde( bool vorwärts );
-	void render( VideoKamera *zKam, Bild &zRObj );
-	// constant
-	int getBreite() const;
-	int getHeight() const;
-	Bild *zMap() const;
-	Bild *zMap( int runde ) const;
-	// Reference Counting
-	VideoKarte *getThis();
-	VideoKarte *release();
+    // Konstruktor
+    VideoKarte();
+    // Destruktor
+    ~VideoKarte();
+    // nicht constant
+    void setSize( int br, int hö );
+    void nextRunde( bool vorwärts );
+    void render( VideoKamera *zKam, Bild &zRObj );
+    // constant
+    int getBreite() const;
+    int getHeight() const;
+    Bild *zMap() const;
+    Bild *zMap( int runde ) const;
 };
 
 #endif

+ 2 - 32
Linie/Aufzeichnung/Nachricht/VideoNachricht.cpp

@@ -3,6 +3,7 @@
 // Inhalt der RundeNachricht Klasse aus VideoNachricht.h
 // Konstruktor
 RundeNachricht::RundeNachricht( Datei *d, int spielerAnzahl )
+    : ReferenceCounter()
 {
     index = 0;
     maxNachricht = 0;
@@ -11,7 +12,6 @@ RundeNachricht::RundeNachricht( Datei *d, int spielerAnzahl )
     rvd = new RundeVideoDaten();
     rsvd = new Array< RundeSpielerVideoDaten * >();
     aktiv = 1;
-    ref = 1;
     vDat->lese( (char *)&rvd->mapBreite, 4 );
     vDat->lese( (char *)&rvd->mapHöhe, 4 );
     for( int i = 0; i < spielerAnzahl; i++ )
@@ -161,25 +161,11 @@ RundeSpielerVideoDaten *RundeNachricht::getRSVD( int index ) const
     return rsvd->get( index );
 }
 
-// Reference Counting
-RundeNachricht *RundeNachricht::getThis()
-{
-    ref++;
-    return this;
-}
-
-RundeNachricht *RundeNachricht::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der SpielNachricht Klasse aus VideoNachricht.h
 // Konatruktor
 SpielNachricht::SpielNachricht( int num )
+    : ReferenceCounter()
 {
     runde = 0;
     maxRunde = 0;
@@ -191,7 +177,6 @@ SpielNachricht::SpielNachricht( int num )
     tvd = new Array< TeamVideoDaten * >();
     error = 0;
     fehler = new Text();
-    ref = 1;
     Text pfad( "data/tmp/historie/" );
     pfad += num;
     pfad += "/verlauf.ksggl";
@@ -348,19 +333,4 @@ int SpielNachricht::getTeamAnzahl() const
 int SpielNachricht::getRunde() const
 {
     return runde;
-}
-
-// Reference Counting
-SpielNachricht *SpielNachricht::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpielNachricht *SpielNachricht::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 53 - 61
Linie/Aufzeichnung/Nachricht/VideoNachricht.h

@@ -9,94 +9,86 @@ using namespace Framework;
 
 struct VideoMSG
 {
-	char typ; // 0 = Tick, 1 = Aktion
+    char typ; // 0 = Tick, 1 = Aktion
 };
 
 // typ = 1
 struct VideoAktionMSG : public VideoMSG
 {
-	int spielerNummer;
-	char aktion; // 0 = T_Links press, 1 = T_Links release, 2 = T_Rechts press, 3 = T_Rechts release, 4 = Chat Nachricht, 5 = Linien Unterbrechung
+    int spielerNummer;
+    char aktion; // 0 = T_Links press, 1 = T_Links release, 2 = T_Rechts press, 3 = T_Rechts release, 4 = Chat Nachricht, 5 = Linien Unterbrechung
 };
 
 // action = 4
 struct VideoChatMSG : public VideoAktionMSG
 {
-	int län;
-	Text msg;
+    int län;
+    Text msg;
 };
 
 // aktion = 5
 struct VideoLinieMSG : public VideoAktionMSG
 {
-	char unterbrechung;
+    char unterbrechung;
 };
 
-class RundeNachricht
+class RundeNachricht : public virtual ReferenceCounter
 {
 private:
-	int index;
-	int maxNachricht;
-	Array< VideoMSG* > *nachrichten;
-	Datei *vDat;
-	RundeVideoDaten *rvd;
-	Array< RundeSpielerVideoDaten* > *rsvd;
-	bool aktiv;
-	int ref;
+    int index;
+    int maxNachricht;
+    Array< VideoMSG * > *nachrichten;
+    Datei *vDat;
+    RundeVideoDaten *rvd;
+    Array< RundeSpielerVideoDaten * > *rsvd;
+    bool aktiv;
 
 public:
-	// Konstruktor
-	RundeNachricht( Datei *d, int spielerAnzahl );
-	// Destruktor
-	~RundeNachricht();
-	// nicht constant
-	VideoMSG *GetNextNachricht();
-	VideoMSG *GetLastNachricht();
-	void setEnde();
-	// constant
-	RundeVideoDaten *getRVD() const;
-	RundeSpielerVideoDaten *getRSVD( int index ) const;
-	// Reference Counting
-	RundeNachricht *getThis();
-	RundeNachricht *release();
+    // Konstruktor
+    RundeNachricht( Datei *d, int spielerAnzahl );
+    // Destruktor
+    ~RundeNachricht();
+    // nicht constant
+    VideoMSG *GetNextNachricht();
+    VideoMSG *GetLastNachricht();
+    void setEnde();
+    // constant
+    RundeVideoDaten *getRVD() const;
+    RundeSpielerVideoDaten *getRSVD( int index ) const;
 };
 
-class SpielNachricht
+class SpielNachricht : public virtual ReferenceCounter
 {
 private:
-	int runde;
-	int maxRunde;
-	int teamAnzahl;
-	RCArray< RundeNachricht > *runden;
-	Datei *vDat;
-	SpielVideoDaten *svd;
-	Array< SpielerVideoDaten* > *spvd;
-	Array< TeamVideoDaten* > *tvd;
-	bool error;
-	Text *fehler;
-	int ref;
+    int runde;
+    int maxRunde;
+    int teamAnzahl;
+    RCArray< RundeNachricht > *runden;
+    Datei *vDat;
+    SpielVideoDaten *svd;
+    Array< SpielerVideoDaten * > *spvd;
+    Array< TeamVideoDaten * > *tvd;
+    bool error;
+    Text *fehler;
 
 public:
-	// Konstruktor
-	SpielNachricht( int num );
-	// Destruktor
-	~SpielNachricht();
-	// nicht constant
-	VideoMSG *GetNextNachricht();
-	VideoMSG *GetLastNachricht();
-	int setRundenEnde( bool vorwärts );
-	// constant
-	SpielVideoDaten *getSVD() const;
-	SpielerVideoDaten *getSPVD( int index ) const;
-	TeamVideoDaten *getTVD( int index ) const;
-	RundeVideoDaten *getRVD() const;
-	RundeSpielerVideoDaten *getRSVD( int index ) const;
-	bool hatFehler( Text *txt ) const;
-	int getTeamAnzahl() const;
-	int getRunde() const;
-	// Reference Counting
-	SpielNachricht *getThis();
-	SpielNachricht *release();
+    // Konstruktor
+    SpielNachricht( int num );
+    // Destruktor
+    ~SpielNachricht();
+    // nicht constant
+    VideoMSG *GetNextNachricht();
+    VideoMSG *GetLastNachricht();
+    int setRundenEnde( bool vorwärts );
+    // constant
+    SpielVideoDaten *getSVD() const;
+    SpielerVideoDaten *getSPVD( int index ) const;
+    TeamVideoDaten *getTVD( int index ) const;
+    RundeVideoDaten *getRVD() const;
+    RundeSpielerVideoDaten *getRSVD( int index ) const;
+    bool hatFehler( Text *txt ) const;
+    int getTeamAnzahl() const;
+    int getRunde() const;
 };
 
 #endif

+ 1 - 16
Linie/Aufzeichnung/Spieler/VideoSpieler.cpp

@@ -7,6 +7,7 @@
 // Inhalt der VideoSpieler Klasse aus VideoSpieler.h
 // Konstruktor
 VideoSpieler::VideoSpieler( SpielerVideoDaten *vDaten )
+    : ReferenceCounter()
 {
     spielerNummer = vDaten->spielerNummer;
     team = vDaten->team;
@@ -20,7 +21,6 @@ VideoSpieler::VideoSpieler( SpielerVideoDaten *vDaten )
     teamRahmen = new LRahmen();
     teamRahmen->setRamenBreite( 1 );
     teamRahmen->setSize( 10, 10 );
-    ref = 1;
     spielerFarbe = vDaten->spielerFarbe;
     teamFarbe = vDaten->teamFarbe;
     name->setText( vDaten->name.getText() );
@@ -367,19 +367,4 @@ int VideoSpieler::getKills( int r ) const
 int VideoSpieler::getTodesZeit( int r ) const
 {
     return rTodesZeit.get( r );
-}
-
-// Reference Counting
-VideoSpieler *VideoSpieler::getThis()
-{
-    ref++;
-    return this;
-}
-
-VideoSpieler *VideoSpieler::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 69 - 73
Linie/Aufzeichnung/Spieler/VideoSpieler.h

@@ -11,85 +11,81 @@ using namespace Framework;
 
 struct VideoSpielerRundeDaten
 {
-	double xPos;
-	double yPos;
-	double xSpeed;
-	double ySpeed;
-	double kurve;
-	int radius;
-	bool amLeben;
-	bool lKurve;
-	bool rKurve;
-	bool linieUnterbrochen;
-	double todesZeit;
-	double spielZeit;
-	int renderVorTod;
+    double xPos;
+    double yPos;
+    double xSpeed;
+    double ySpeed;
+    double kurve;
+    int radius;
+    bool amLeben;
+    bool lKurve;
+    bool rKurve;
+    bool linieUnterbrochen;
+    double todesZeit;
+    double spielZeit;
+    int renderVorTod;
 };
 
-class VideoSpieler
+class VideoSpieler : public virtual ReferenceCounter
 {
 private:
-	int spielerNummer;
-	int team;
-	int spielerFarbe;
-	int teamFarbe;
-	Array< VideoSpielerRundeDaten* > *daten;
-	int runde;
-	Text *name;
-	Text *teamName;
-	Rahmen *teamRahmen;
-	int gewonneneRunden;
-	int linienLänge;
-	double zeitAmLeben;
-	double zeitTod;
-	int kills;
-	int tode;
-	int killFarbe;
-	Array< int > rLinienLänge;
-	Array< int > rKills;
-	Array< int > rTodesZeit;
-	int ref;
+    int spielerNummer;
+    int team;
+    int spielerFarbe;
+    int teamFarbe;
+    Array< VideoSpielerRundeDaten * > *daten;
+    int runde;
+    Text *name;
+    Text *teamName;
+    Rahmen *teamRahmen;
+    int gewonneneRunden;
+    int linienLänge;
+    double zeitAmLeben;
+    double zeitTod;
+    int kills;
+    int tode;
+    int killFarbe;
+    Array< int > rLinienLänge;
+    Array< int > rKills;
+    Array< int > rTodesZeit;
 
 public:
-	// Konstruktor
-	VideoSpieler( SpielerVideoDaten *vDaten );
-	// Destruktor
-	~VideoSpieler();
-	// nicht constant
-	void addKill();
-	void neuRunde( bool vorwärts, RundeSpielerVideoDaten *vDaten, bool amLeben );
-	void setLinksKurve( bool lKurve );
-	void setRechtsKurve( bool rKurve );
-	void setLinienUnterbrechung( bool unterbrechung );
-	void prozessKurve( double zeit );
-	void tick( Bild *zMap, double zeit );
-	void render( VideoKamera *zKam, Bild &zRObj );
-	// constant
-	double getX() const;
-	double getY() const;
-	int getTeam() const;
-	int getTeamFarbe() const;
-	int getFarbe() const;
-	int getSpielerNummer() const;
-	bool istAmLeben() const;
-	Text *getName() const;
-	Text *zName() const;
-	Text *getTeamName() const;
-	Text *zTeamName() const;
-	bool istMausIn( int mx, int my ) const;
-	int getGewonneneRunden() const;
-	int getLinienLänge() const;
-	int getZeitAmLeben() const;
-	int getZeitTod() const;
-	int getKills() const;
-	int getTode() const;
-	int getKillFarbe() const;
-	int getLinienLänge( int r ) const;
-	int getKills( int r ) const;
-	int getTodesZeit( int r ) const;
-	// Reference Counting
-	VideoSpieler *getThis();
-	VideoSpieler *release();
+    // Konstruktor
+    VideoSpieler( SpielerVideoDaten *vDaten );
+    // Destruktor
+    ~VideoSpieler();
+    // nicht constant
+    void addKill();
+    void neuRunde( bool vorwärts, RundeSpielerVideoDaten *vDaten, bool amLeben );
+    void setLinksKurve( bool lKurve );
+    void setRechtsKurve( bool rKurve );
+    void setLinienUnterbrechung( bool unterbrechung );
+    void prozessKurve( double zeit );
+    void tick( Bild *zMap, double zeit );
+    void render( VideoKamera *zKam, Bild &zRObj );
+    // constant
+    double getX() const;
+    double getY() const;
+    int getTeam() const;
+    int getTeamFarbe() const;
+    int getFarbe() const;
+    int getSpielerNummer() const;
+    bool istAmLeben() const;
+    Text *getName() const;
+    Text *zName() const;
+    Text *getTeamName() const;
+    Text *zTeamName() const;
+    bool istMausIn( int mx, int my ) const;
+    int getGewonneneRunden() const;
+    int getLinienLänge() const;
+    int getZeitAmLeben() const;
+    int getZeitTod() const;
+    int getKills() const;
+    int getTode() const;
+    int getKillFarbe() const;
+    int getLinienLänge( int r ) const;
+    int getKills( int r ) const;
+    int getTodesZeit( int r ) const;
 };
 
 #endif

+ 167 - 169
Linie/Aufzeichnung/Steuerung/VideoSteuerung.cpp

@@ -1,219 +1,217 @@
 #include "VideoSteuerung.h"
-#include "../../Initialisierung/Initialisierung.h"
 #include <DateiSystem.h>
 #include <Text.h>
 #include <Punkt.h>
 #include <Bildschirm.h>
 #include <MausEreignis.h>
+#include <Bild.h>
 
 // Inhalt der VideoSteuerung Klasse aus VideoSteuerung.h
 // Konstruktor
-VideoSteuerung::VideoSteuerung( Schrift *zSchrift, Bildschirm *zScreen )
+VideoSteuerung::VideoSteuerung( UIInit &uiFactory )
+    : ReferenceCounter()
 {
-	pos = zScreen->getBackBufferSize() - Punkt( 285, 30 );
-	verlassen = initKnopf( 0, 0, 100, 22, zSchrift, Knopf::Style::Sichtbar, "Verlassen" );
-	initToolTip( verlassen, "Aufzeichnung verlassen", zSchrift, zScreen );
-	langsamer = initKnopf( 105, 0, 22, 22, 0, 0, "" );
-	langsamer->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::Hintergrund | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-	langsamer->setRahmenBreite( 1 );
-	stop = initKnopf( 130, 0, 22, 22, 0, 0, "" );
-	stop->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::Hintergrund | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-	stop->setRahmenBreite( 1 );
-	schneller = initKnopf( 155, 0, 22, 22, 0, 0, "" );
-	schneller->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::Hintergrund | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-	schneller->setRahmenBreite( 1 );
-	LTDBDatei *vBilder = new LTDBDatei();
-	vBilder->setDatei( new Text( "data/client/bilder/video.ltdb" ) );
-	vBilder->leseDaten( 0 );
-	langsamer->setHintergrundBildZ( vBilder->laden( 0, new Text( "zurück.png" ) ) );
-	stop->setHintergrundBildZ( vBilder->laden( 0, new Text( "pause.png" ) ) );
-	schneller->setHintergrundBildZ( vBilder->laden( 0, new Text( "vor.png" ) ) );
-	vBilder->release();
-	initToolTip( langsamer, "Langsammer abspielen", zSchrift, zScreen );
-	initToolTip( stop, "Pause", zSchrift, zScreen );
-	initToolTip( schneller, "Schneller abspielen", zSchrift, zScreen );
-	zeit = initTextFeld( 180, 0, 100, 22, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0:0:0" );
-	spielZeit = 0;
-	speed = 1;
-	vorwärts = 1;
-	zeitlupe = 0;
-	beendet = 0;
-	bJetzt = 0;
-	ref = 1;
+    pos = uiFactory.initParam.bildschirm->getBackBufferSize() - Punkt( 285, 30 );
+    verlassen = uiFactory.createKnopf( uiFactory.initParam );
+    verlassen->setPosition( 0, 0 );
+    verlassen->setSize( 100, 22 );
+    verlassen->setText( "Verlassen" );
+    verlassen->setToolTipText( "Aufzeichnung verlassen", uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
+    langsamer = uiFactory.createKnopf( uiFactory.initParam );
+    langsamer->setPosition( 105, 0 );
+    langsamer->setSize( 22, 22 );
+    langsamer->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::Hintergrund | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
+    langsamer->setRahmenBreite( 1 );
+    langsamer->setToolTipText( "Langsammer abspielen", uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
+    stop = uiFactory.createKnopf( uiFactory.initParam );
+    stop->setPosition( 130, 0 );
+    stop->setSize( 22, 22 );
+    stop->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::Hintergrund | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
+    stop->setRahmenBreite( 1 );
+    stop->setToolTipText( "Pause", uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
+    schneller = uiFactory.createKnopf( uiFactory.initParam );
+    schneller->setPosition( 155, 0 );
+    schneller->setSize( 22, 22 );
+    schneller->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::Hintergrund | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
+    schneller->setRahmenBreite( 1 );
+    schneller->setToolTipText( "Schneller abspielen", uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
+    LTDBDatei *vBilder = new LTDBDatei();
+    vBilder->setDatei( new Text( "data/client/bilder/video.ltdb" ) );
+    vBilder->leseDaten( 0 );
+    langsamer->setHintergrundBildZ( vBilder->laden( 0, new Text( "zurück.png" ) ) );
+    stop->setHintergrundBildZ( vBilder->laden( 0, new Text( "pause.png" ) ) );
+    schneller->setHintergrundBildZ( vBilder->laden( 0, new Text( "vor.png" ) ) );
+    vBilder->release();
+    zeit = uiFactory.createTextFeld( uiFactory.initParam );
+    zeit->setPosition( 180, 0 );
+    zeit->setSize( 100, 22 );
+    zeit->addStyle( TextFeld::Style::Center );
+    zeit->setText( "0:0:0" );
+    spielZeit = 0;
+    speed = 1;
+    vorwärts = 1;
+    zeitlupe = 0;
+    beendet = 0;
+    bJetzt = 0;
 }
 
 // Destruktor
 VideoSteuerung::~VideoSteuerung()
 {
-	verlassen->release();
-	langsamer->release();
-	stop->release();
-	schneller->release();
-	zeit->release();
+    verlassen->release();
+    langsamer->release();
+    stop->release();
+    schneller->release();
+    zeit->release();
 }
 
 // Nicht constant
 void VideoSteuerung::doPublicMausEreignis( MausEreignis &me )
 {
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	bool vera = me.verarbeitet;
-	verlassen->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet )
-	{
-		if( me.id == ME_RLinks )
-		{
-			bJetzt = 1;
-			beendet = 1;
-		}
-		vera = 1;
-	}
-	langsamer->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet )
-	{
-		if( me.id == ME_RLinks )
-		{
-			if( !speed )
-			{
-				vorwärts = 0;
-				speed = 1;
-				stop->addStyle( Knopf::Style::Erlaubt );
-				schneller->addStyle( Knopf::Style::Erlaubt );
-			}
-			else
-			{
-				speed += ( vorwärts && zeitlupe ) || ( !vorwärts && !zeitlupe );
-				speed -= ( vorwärts && !zeitlupe ) || ( !vorwärts && zeitlupe );
-				zeitlupe |= vorwärts && ( speed == 0 );
-				zeitlupe &= vorwärts || ( speed != 0 );
-				speed += speed == 0;
-			}
-		}
-		vera = 1;
-	}
-	stop->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet )
-	{
-		if( me.id == ME_RLinks )
-		{
-			speed = 0;
-			zeitlupe = 0;
-			stop->removeStyle( Knopf::Style::Erlaubt );
-		}
-		vera = 1;
-	}
-	schneller->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet )
-	{
-		if( me.id == ME_RLinks )
-		{
-			if( !speed )
-			{
-				vorwärts = 1;
-				speed = 1;
-				stop->addStyle( Knopf::Style::Erlaubt );
-				langsamer->addStyle( Knopf::Style::Erlaubt );
-			}
-			else
-			{
-				speed += ( vorwärts && !zeitlupe ) || ( !vorwärts && zeitlupe );
-				speed -= ( vorwärts && zeitlupe ) || ( !vorwärts && !zeitlupe );
-				zeitlupe |= !vorwärts && ( speed == 0 );
-				zeitlupe &= !vorwärts || ( speed != 0 );
-				speed += speed == 0;
-			}
-		}
-		vera = 1;
-	}
-	me.mx += pos.x;
-	me.my += pos.y;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    bool vera = me.verarbeitet;
+    verlassen->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet )
+    {
+        if( me.id == ME_RLinks )
+        {
+            bJetzt = 1;
+            beendet = 1;
+        }
+        vera = 1;
+    }
+    langsamer->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet )
+    {
+        if( me.id == ME_RLinks )
+        {
+            if( !speed )
+            {
+                vorwärts = 0;
+                speed = 1;
+                stop->addStyle( Knopf::Style::Erlaubt );
+                schneller->addStyle( Knopf::Style::Erlaubt );
+            }
+            else
+            {
+                speed += ( vorwärts && zeitlupe ) || ( !vorwärts && !zeitlupe );
+                speed -= ( vorwärts && !zeitlupe ) || ( !vorwärts && zeitlupe );
+                zeitlupe |= vorwärts && ( speed == 0 );
+                zeitlupe &= vorwärts || ( speed != 0 );
+                speed += speed == 0;
+            }
+        }
+        vera = 1;
+    }
+    stop->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet )
+    {
+        if( me.id == ME_RLinks )
+        {
+            speed = 0;
+            zeitlupe = 0;
+            stop->removeStyle( Knopf::Style::Erlaubt );
+        }
+        vera = 1;
+    }
+    schneller->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet )
+    {
+        if( me.id == ME_RLinks )
+        {
+            if( !speed )
+            {
+                vorwärts = 1;
+                speed = 1;
+                stop->addStyle( Knopf::Style::Erlaubt );
+                langsamer->addStyle( Knopf::Style::Erlaubt );
+            }
+            else
+            {
+                speed += ( vorwärts && !zeitlupe ) || ( !vorwärts && zeitlupe );
+                speed -= ( vorwärts && zeitlupe ) || ( !vorwärts && !zeitlupe );
+                zeitlupe |= !vorwärts && ( speed == 0 );
+                zeitlupe &= !vorwärts || ( speed != 0 );
+                speed += speed == 0;
+            }
+        }
+        vera = 1;
+    }
+    me.mx += pos.x;
+    me.my += pos.y;
 }
 
 bool VideoSteuerung::tick( double zeit )
 {
-	bool ret = langsamer->tick( zeit );
-	ret |= verlassen->tick( zeit );
-	ret |= stop->tick( zeit );
-	ret |= schneller->tick( zeit );
-	spielZeit += zeit;
-	if( (int)spielZeit != (int)( spielZeit - zeit ) )
-	{
-		Text z;
-		z = (int)spielZeit / 60 / 60;
-		z += ":";
-		z += (int)spielZeit / 60 % 60;
-		z += ":";
-		z += (int)spielZeit % 60;
-		this->zeit->setText( z );
-	}
-	ret |= this->zeit->tick( zeit );
-	return ret;
+    bool ret = langsamer->tick( zeit );
+    ret |= verlassen->tick( zeit );
+    ret |= stop->tick( zeit );
+    ret |= schneller->tick( zeit );
+    spielZeit += zeit;
+    if( (int)spielZeit != (int)( spielZeit - zeit ) )
+    {
+        Text z;
+        z = (int)spielZeit / 60 / 60;
+        z += ":";
+        z += (int)spielZeit / 60 % 60;
+        z += ":";
+        z += (int)spielZeit % 60;
+        this->zeit->setText( z );
+    }
+    ret |= this->zeit->tick( zeit );
+    return ret;
 }
 
 void VideoSteuerung::render( Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( pos.x, pos.y, 300, 30 ) )
-		return;
-	verlassen->render( zRObj );
-	langsamer->render( zRObj );
-	stop->render( zRObj );
-	schneller->render( zRObj );
-	zeit->render( zRObj );
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( pos.x, pos.y, 300, 30 ) )
+        return;
+    verlassen->render( zRObj );
+    langsamer->render( zRObj );
+    stop->render( zRObj );
+    schneller->render( zRObj );
+    zeit->render( zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 void VideoSteuerung::pause( bool ende )
 {
-	speed = 0;
-	zeitlupe = 0;
-	stop->removeStyle( Knopf::Style::Erlaubt );
-	if( ende )
-		schneller->removeStyle( Knopf::Style::Erlaubt );
-	else
-		langsamer->removeStyle( Knopf::Style::Erlaubt );
+    speed = 0;
+    zeitlupe = 0;
+    stop->removeStyle( Knopf::Style::Erlaubt );
+    if( ende )
+        schneller->removeStyle( Knopf::Style::Erlaubt );
+    else
+        langsamer->removeStyle( Knopf::Style::Erlaubt );
 }
 
 bool VideoSteuerung::istBeendet( bool jetzt )
 {
-	if( jetzt )
-	{
-		if( bJetzt )
-		{
-			bJetzt = 0;
-			return 1;
-		}
-		return 0;
-	}
-	return beendet;
+    if( jetzt )
+    {
+        if( bJetzt )
+        {
+            bJetzt = 0;
+            return 1;
+        }
+        return 0;
+    }
+    return beendet;
 }
 
 // constant
 int VideoSteuerung::getSpeed() const
 {
-	return speed + zeitlupe;
+    return speed + zeitlupe;
 }
 
 bool VideoSteuerung::istVorwärts() const
 {
-	return vorwärts;
+    return vorwärts;
 }
 
 bool VideoSteuerung::istZeitlupe() const
 {
-	return zeitlupe;
-}
-
-// Reference Counting
-VideoSteuerung *VideoSteuerung::getThis()
-{
-	ref++;
-	return this;
-}
-
-VideoSteuerung *VideoSteuerung::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return zeitlupe;
 }

+ 28 - 31
Linie/Aufzeichnung/Steuerung/VideoSteuerung.h

@@ -2,44 +2,41 @@
 #define VideoSteuerung_H
 
 #include <Knopf.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
-class VideoSteuerung
+class VideoSteuerung : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Knopf *verlassen;
-	Knopf *langsamer;
-	Knopf *stop;
-	Knopf *schneller;
-	TextFeld *zeit;
-	double spielZeit;
-	int speed;
-	bool vorwärts;
-	bool zeitlupe;
-	bool beendet;
-	bool bJetzt;
-	int ref;
+    Punkt pos;
+    Knopf *verlassen;
+    Knopf *langsamer;
+    Knopf *stop;
+    Knopf *schneller;
+    TextFeld *zeit;
+    double spielZeit;
+    int speed;
+    bool vorwärts;
+    bool zeitlupe;
+    bool beendet;
+    bool bJetzt;
 
 public:
-	// Konstruktor
-	VideoSteuerung( Schrift *zSchrift, Bildschirm *zScreen );
-	// Destruktor
-	~VideoSteuerung();
-	// Nicht constant
-	void doPublicMausEreignis( MausEreignis &me );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	void pause( bool ende );
-	bool istBeendet( bool jetzt );
-	// constant
-	int getSpeed() const;
-	bool istVorwärts() const;
-	bool istZeitlupe() const;
-	// Reference Counting
-	VideoSteuerung *getThis();
-	VideoSteuerung *release();
+    // Konstruktor
+    VideoSteuerung( UIInit &uiFactory );
+    // Destruktor
+    ~VideoSteuerung();
+    // Nicht constant
+    void doPublicMausEreignis( MausEreignis &me );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    void pause( bool ende );
+    bool istBeendet( bool jetzt );
+    // constant
+    int getSpeed() const;
+    bool istVorwärts() const;
+    bool istZeitlupe() const;
 };
 
 #endif

+ 9 - 33
Linie/HistorieStatistik/HistorieStatistik.cpp

@@ -2,7 +2,6 @@
 #include <Knopf.h>
 #include <MausEreignis.h>
 #include <Bildschirm.h>
-#include "../Initialisierung/Initialisierung.h"
 #include <InitDatei.h>
 #include <DateiSystem.h>
 #include "StatistikLeser.h"
@@ -10,9 +9,8 @@
 // Inhalt der HistorieStatistik Klasse aus HistorieStatistik.h
 // Konstruktor
 HistorieStatistik::HistorieStatistik()
+    : ReferenceCounter()
 {
-    schrift = 0;
-    screen = 0;
     gss = new Array< SSDGesamtSpieler * >();
     gts = new Array< SSDGesamtTeam * >();
     rs = new Array< SSDRunde * >();
@@ -25,14 +23,11 @@ HistorieStatistik::HistorieStatistik()
     sichtbar = 0;
     tickVal = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
 HistorieStatistik::~HistorieStatistik()
 {
-    if( schrift )
-        schrift->release();
     if( !geladen )
     {
         gss->release();
@@ -86,16 +81,9 @@ HistorieStatistik::~HistorieStatistik()
 }
 
 // nicht constant
-void HistorieStatistik::setSchrift( Schrift *schrift )
+void HistorieStatistik::setUIFactory( UIInit &factory )
 {
-    if( this->schrift )
-        this->schrift->release();
-    this->schrift = schrift;
-}
-
-void HistorieStatistik::setBildschirm( Bildschirm *zScreen )
-{
-    screen = zScreen;
+    uiFactory = factory;
 }
 
 void HistorieStatistik::ladeDaten( int spielId )
@@ -110,9 +98,12 @@ void HistorieStatistik::ladeDaten( int spielId )
     for( int i = 0; i < reader->getRundenAnzahl(); i++ )
         rs->set( reader->getSSDR( i ), i );
     reader->release();
-    tabelle = new StatistikTabelle( dynamic_cast<Array<SSDGesamtSpieler *> *>( gss->getThis() ), dynamic_cast<Array<SSDGesamtTeam *> *>( gts->getThis() ), dynamic_cast<Array<SSDRunde *> *>( rs->getThis() ), schrift, screen, 1 );
-    runde = new StatistikRunde( schrift, dynamic_cast<Array<SSDRunde *> *>( rs->getThis() ), 1 );
-    fertig = initKnopf( 600, 390, 100, 20, schrift, Knopf::Style::Sichtbar, "Zurück" );
+    tabelle = new StatistikTabelle( dynamic_cast<Array<SSDGesamtSpieler *> *>( gss->getThis() ), dynamic_cast<Array<SSDGesamtTeam *> *>( gts->getThis() ), dynamic_cast<Array<SSDRunde *> *>( rs->getThis() ), uiFactory, 1 );
+    runde = new StatistikRunde( uiFactory, dynamic_cast<Array<SSDRunde *> *>( rs->getThis() ), 1 );
+    fertig = uiFactory.createKnopf( uiFactory.initParam );
+    fertig->setPosition( 600, 390 );
+    fertig->setSize( 100, 20 );
+    fertig->setText( "Zurück" );
     geladen = 1;
 }
 
@@ -191,19 +182,4 @@ bool HistorieStatistik::istNochSichtbar() const
 bool HistorieStatistik::wurdeGeschlossen() const
 {
     return geschlossen;
-}
-
-// Reference Counting
-AccountHistorieStatistikV *HistorieStatistik::getThis()
-{
-    ref++;
-    return this;
-}
-
-AccountHistorieStatistikV *HistorieStatistik::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 28 - 34
Linie/HistorieStatistik/HistorieStatistik.h

@@ -9,42 +9,36 @@
 class HistorieStatistik : public AccountHistorieStatistikV
 {
 private:
-	Schrift *schrift;
-	Bildschirm *screen;
-	Array< SSDGesamtSpieler* > *gss;
-	Array< SSDGesamtTeam* > *gts;
-	Array< SSDRunde* > *rs;
-	StatistikRunde *runde;
-	StatistikTabelle *tabelle;
-	Knopf *fertig;
-	bool geladen;
-	bool geschlossen;
-	unsigned char alpha;
-	bool sichtbar;
-	double tickVal;
-	bool rend;
-	int ref;
+    UIInit uiFactory;
+    Array< SSDGesamtSpieler * > *gss;
+    Array< SSDGesamtTeam * > *gts;
+    Array< SSDRunde * > *rs;
+    StatistikRunde *runde;
+    StatistikTabelle *tabelle;
+    Knopf *fertig;
+    bool geladen;
+    bool geschlossen;
+    unsigned char alpha;
+    bool sichtbar;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	HistorieStatistik();
-	// Destruktor
-	~HistorieStatistik();
-	// nicht constant
-	virtual void setSchrift( Schrift *schrift );
-	virtual void setBildschirm( Bildschirm *zScreen );
-	virtual void ladeDaten( int spielId );
-	virtual void setSichtbar( bool sichtbar );
-	virtual void doPublicMausEreignis( MausEreignis &me );
-	virtual void doTastaturEreignis( TastaturEreignis &te );
-	virtual bool tick( double tickVal );
-	virtual void render( Bild &zRObj );
-	// constant
-	virtual bool istNochSichtbar() const;
-	virtual bool wurdeGeschlossen() const;
-	// Reference Counting
-	virtual AccountHistorieStatistikV *getThis();
-	virtual AccountHistorieStatistikV *release();
+    // Konstruktor
+    HistorieStatistik();
+    // Destruktor
+    ~HistorieStatistik();
+    // nicht constant
+    virtual void setUIFactory( UIInit &factory );
+    virtual void ladeDaten( int spielId );
+    virtual void setSichtbar( bool sichtbar );
+    virtual void doPublicMausEreignis( MausEreignis &me );
+    virtual void doTastaturEreignis( TastaturEreignis &te );
+    virtual bool tick( double tickVal );
+    virtual void render( Bild &zRObj );
+    // constant
+    virtual bool istNochSichtbar() const;
+    virtual bool wurdeGeschlossen() const;
 };
 
 #endif

+ 355 - 370
Linie/HistorieStatistik/StatistikLeser.cpp

@@ -3,409 +3,394 @@
 // Inhalt der StatistikLeser Klasse aus StatistikLeser.h
 // Konstruktor
 StatistikLeser::StatistikLeser( int spielId )
+    : ReferenceCounter()
 {
-	nachrichten = new SpielNachricht( spielId );
-	bestenliste = new VideoBestenliste( 0 );
-	map = new VideoKarte();
-	spieler = new RCArray< VideoSpieler >();
-	ssdgs = new Array< SSDGesamtSpieler* >();
-	ssdgt = new Array< SSDGesamtTeam* >();
-	ssdr = new Array< SSDRunde* >();
-	spielerAnzahl = 0;
-	teamAnzahl = 0;
-	rundenAnzahl = 0;
-	ref = 1;
-	Text f;
-	fehler = nachrichten->hatFehler( &f );
-	if( fehler )
-		return;
-	// Spiel Initialisieren
-	spielerAnzahl = nachrichten->getSVD()->spielerAnzahl;
-	teamAnzahl = nachrichten->getTeamAnzahl();
-	int maxTeam = 0;
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		SpielerVideoDaten *dat = nachrichten->getSPVD( i );
-		VideoSpieler *tmp = new VideoSpieler( dat );
-		bestenliste->addSpieler( tmp );
-		spieler->set( tmp, i );
-		maxTeam = maxTeam < dat->team ? dat->team : maxTeam;
-	}
-	maxTeam++;
-	bestenliste->setTeamAnzahl( maxTeam );
-	for( int i = 0; i < nachrichten->getTeamAnzahl(); i++ )
-	{
-		TeamVideoDaten *dat = nachrichten->getTVD( i );
-		bestenliste->setTeamMaxPunkte( dat->teamNummer, dat->maxPunkte );
-		bestenliste->setTeamPunkte( dat->teamNummer, dat->punkte );
-	}
-	RundeVideoDaten *rDat = nachrichten->getRVD();
-	map->setSize( rDat->mapBreite, rDat->mapHöhe );
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		RundeSpielerVideoDaten *dat = nachrichten->getRSVD( i );
-		spieler->z( i )->neuRunde( 1, dat, 1 );
-	}
-	Array< int > rundenSieger;
-	Array< int > rundenDauer;
-	VideoMSG *nMsg = 0;
-	double sZeit = 0;
-	// Spiel nachstellen
-	while( 1 )
-	{
-		while( !nMsg || nMsg->typ )
-		{
-			if( !nMsg )
-				nMsg = nachrichten->GetNextNachricht();
-			if( !nMsg )
-				break;
-			if( !nMsg->typ )
-				break;
-			VideoAktionMSG *ak = (VideoAktionMSG*)nMsg;
-			switch( ak->aktion )
-			{
-			case 0: // T_Links Press
-				for( int i = 0; i < spielerAnzahl; i++ )
-				{
-					if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
-					{
-						spieler->z( i )->setLinksKurve( 1 );
-						break;
-					}
-				}
-				break;
-			case 1: // T_Links Release
-				for( int i = 0; i < spielerAnzahl; i++ )
-				{
-					if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
-					{
-						spieler->z( i )->setLinksKurve( 0 );
-						break;
-					}
-				}
-				break;
-			case 2: // T_Rechts Press
-				for( int i = 0; i < spielerAnzahl; i++ )
-				{
-					if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
-					{
-						spieler->z( i )->setRechtsKurve( 1 );
-						break;
-					}
-				}
-				break;
-			case 3: // T_Rechts Release
-				for( int i = 0; i < spielerAnzahl; i++ )
-				{
-					if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
-					{
-						spieler->z( i )->setRechtsKurve( 0 );
-						break;
-					}
-				}
-				break;
-			case 5: // Linien Unterbrechung
-				if( 1 )
-				{
-					VideoLinieMSG *lMsg = (VideoLinieMSG*)ak;
-					for( int i = 0; i < spielerAnzahl; i++ )
-					{
-						if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
-						{
-							spieler->z( i )->setLinienUnterbrechung( lMsg->unterbrechung != 0 );
-							break;
-						}
-					}
-				}
-				break;
-			}
-			nMsg = 0;
-		}
-		if( !nMsg )
-			break;
-		sZeit += TICK;
-		bool rEnd = 0;
-		int tmpTeam = -1;
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{
-			VideoSpieler *tmp = spieler->z( i );
-			if( tmp )
-			{
-				bool amLeben = tmp->istAmLeben();
-				tmp->tick( map->zMap(), TICK );
-				if( amLeben != tmp->istAmLeben() )
-				{
-					for( int j = 0; j < spielerAnzahl; j++ )
-					{
-						VideoSpieler *s = spieler->z( j );
-						if( s && s->getFarbe() == tmp->getKillFarbe() )
-							s->addKill();
-						if( s && s != tmp && s->istAmLeben() )
-							bestenliste->addPunkt( s->getTeam(), s->getSpielerNummer(), 1 );
-					}
-				}
-				if( amLeben && !tmp->istAmLeben() )
-				{ // gestorben
-					int team = tmp->getTeam();
-					bool teamLebt = 0;
-					for( int k = 0; k < spielerAnzahl; k++ )
-					{
-						if( spieler->z( k ) && spieler->z( k )->getTeam() == team )
-							teamLebt |= spieler->z( k )->istAmLeben();
-					}
-					if( !teamLebt )
-					{
-						int teamAmLebenAnzahl = 0;
-						for( int k = 0; k < maxTeam; k++ )
-						{
-							if( !bestenliste->teamExistiert( k ) )
-								continue;
-							bool amLeben = 0;
-							for( int l = 0; l < spielerAnzahl; l++ )
-							{
-								if( spieler->z( l ) && spieler->z( l )->getTeam() == k )
-									amLeben |= spieler->z( l )->istAmLeben();
-							}
-							if( amLeben )
-							{
-								tmpTeam = k;
-								teamAmLebenAnzahl++;
-								bestenliste->addPunkt( k, 1 );
-							}
-							else
-								bestenliste->addPunkt( k, 0 );
-							if( !bestenliste->getTeamPunkte( k ) )
-								bestenliste->setTeamStatus( k, "tod", 0xFFFF0000 );
-						}
-						if( teamAmLebenAnzahl <= 1 )
-							rEnd = 1;
-					}
-				}
-			}
-		}
-		if( rEnd )
-		{ // Runden Ende
-			rundenSieger.set( tmpTeam, rundenAnzahl );
-			rundenDauer.set( (int)sZeit, rundenAnzahl );
-			rundenAnzahl++;
-			sZeit = 0;
-			int nAnz = 0;
-			int nAnz2 = 0;
-			for( int i = 0; i < maxTeam; i++ )
-			{
-				if( bestenliste->teamExistiert( i ) )
-				{
-					nAnz += bestenliste->hatTeamGewonnen( i );
-					nAnz2 += bestenliste->getTeamPunkte( i ) >= 0;
-				}
-			}
-			if( nAnz || nAnz2 <= 1 || rundenAnzahl >= 10 )
-			{
-				RundeSpielerVideoDaten dat;
-				for( int i = 0; i < spielerAnzahl; i++ )
-					spieler->z( i )->neuRunde( 1, &dat, 1 );
-				break; // Spiel Ende
-			}
-			int r = nachrichten->setRundenEnde( 1 );
-			bestenliste->updatePunkte();
-			map->nextRunde( 1 );
-			RundeVideoDaten *dat = nachrichten->getRVD();
-			map->setSize( dat->mapBreite, dat->mapHöhe );
-			for( int i = 0; i < spielerAnzahl; i++ )
-				spieler->z( i )->neuRunde( 1, nachrichten->getRSVD( i ), bestenliste->getTeamPunkte( spieler->z( i )->getTeam() ) != 0 );
-		}
-		nMsg = 0;
-	}
-	// Statistik erstellen
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		SSDGesamtSpieler *ssdgs = new SSDGesamtSpieler();
-		VideoSpieler *tmp = spieler->z( i );
-		ssdgs->spielerNummer = tmp->getSpielerNummer();
-		ssdgs->spielerName.setText( tmp->zName()->getText() );
-		ssdgs->teamName.setText( tmp->zTeamName()->getText() );
-		ssdgs->spielerFarbe = tmp->getFarbe();
-		ssdgs->teamFarbe = tmp->getTeamFarbe();
-		ssdgs->gewonneneRunden = tmp->getGewonneneRunden();
-		ssdgs->punkte = bestenliste->getSpielerPunkte( tmp->getTeam(), tmp->getSpielerNummer() );
-		ssdgs->linienLänge = tmp->getLinienLänge();
-		ssdgs->zeitAmLeben = tmp->getZeitAmLeben();
-		ssdgs->zeitTod = tmp->getZeitTod();
-		ssdgs->kills = tmp->getKills();
-		ssdgs->tode = tmp->getTode();
-		this->ssdgs->set( ssdgs, i );
-	}
-	Array< int > teams;
-	for( int i = 0; i < teamAnzahl; i++ )
-	{
-		for( int j = 0; j < spielerAnzahl; j++ )
-		{
-			if( teams.getWertIndex( spieler->z( j )->getTeam() ) < 0 )
-			{
-				teams.set( spieler->z( j )->getTeam(), i );
-				break;
-			}
-		}
-		if( teams.hat( i ) )
-		{
-			SSDGesamtTeam *ssdgt = new SSDGesamtTeam();
-			ssdgt->teamNummer = teams.get( i );
-			for( int j = 0; j < spielerAnzahl; j++ )
-			{
-				VideoSpieler *tmp = spieler->z( j );
-				if( tmp->getTeam() == ssdgt->teamNummer )
-				{
-					ssdgt->teamName.setText( tmp->zTeamName()->getText() );
-					ssdgt->teamFarbe = tmp->getTeamFarbe();
-					break;
-				}
-			}
-			ssdgt->gewonneneRunden = 0;
-			for( int j = 0; j < rundenAnzahl; j++ )
-			{
-				if( rundenSieger.get( j ) == ssdgt->teamNummer )
-					ssdgt->gewonneneRunden++;
-			}
-			ssdgt->punkte = 0;
-			ssdgt->linienLänge = 0;
-			ssdgt->kills = 0;
-			ssdgt->tode = 0;
-			for( int j = 0; j < spielerAnzahl; j++ )
-			{
-				VideoSpieler *tmp = spieler->z( j );
-				if( tmp->getTeam() == ssdgt->teamNummer )
-				{
-					ssdgt->punkte += bestenliste->getSpielerPunkte( tmp->getTeam(), tmp->getSpielerNummer() );
-					ssdgt->linienLänge += tmp->getLinienLänge();
-					ssdgt->kills += tmp->getKills();
-					ssdgt->tode += tmp->getTode();
-				}
-			}
-			this->ssdgt->set( ssdgt, i );
-		}
-	}
-	for( int i = 0; i < rundenAnzahl; i++ )
-	{
-		SSDRunde *ssdr = new SSDRunde();
-		ssdr->rundenNummer = i;
-		ssdr->rundenDauer = rundenDauer.get( i );
-		ssdr->rundenSieger = rundenSieger.get( i );
-		ssdr->rundenBild.neuBild( map->zMap( i )->getBreite(), map->zMap( i )->getHeight(), 0 );
-		ssdr->rundenBild.drawBild( 0, 0, map->zMap( i )->getBreite(), map->zMap( i )->getHeight(), *map->zMap( i ) );
-		ssdr->spielfeldNutzung = 0;
-		int *rbBuff = ssdr->rundenBild.getBuffer();
-		for( int j = 0; j < ssdr->rundenBild.getBreite() * ssdr->rundenBild.getHeight(); j++ )
-		{
-			if( rbBuff[ j ] )
-				ssdr->spielfeldNutzung++;
-		}
-		ssdr->spielfeldNutzung = (int)( ( ssdr->spielfeldNutzung / ( (double)( ssdr->rundenBild.getBreite() * ssdr->rundenBild.getHeight() ) / 25 ) ) * 100 );
-		for( int j = 0; j < spielerAnzahl; j++ )
-		{
-			VideoSpieler *tmp = spieler->z( j );
-			SSDRundeSpieler *ssdrs = new SSDRundeSpieler();
-			ssdrs->spielerNummer = tmp->getSpielerNummer();
-			ssdrs->spielerName.setText( tmp->zName()->getText() );
-			ssdrs->teamName.setText( tmp->zTeamName()->getText() );
-			ssdrs->spielerFarbe = tmp->getFarbe();
-			ssdrs->teamFarbe = tmp->getTeamFarbe();
-			ssdrs->linienLänge = tmp->getLinienLänge( i );
-			ssdrs->kills = tmp->getKills( i );
-			ssdrs->todesZeit = tmp->getTodesZeit( i );
-			ssdr->spieler.set( ssdrs, j );
-		}
-		for( int j = 0; j < teamAnzahl; j++ )
-		{
-			SSDRundeTeam *ssdrt = new SSDRundeTeam();
-			ssdrt->teamNummer = teams.get( j );
-			for( int k = 0; k < spielerAnzahl; k++ )
-			{
-				if( spieler->z( k )->getTeam() == ssdrt->teamNummer )
-				{
-					ssdrt->teamName.setText( spieler->z( k )->zTeamName()->getText() );
-					ssdrt->teamFarbe = spieler->z( k )->getTeamFarbe();
-					break;
-				}
-			}
-			ssdrt->ergebnis = rundenSieger.get( i ) == ssdrt->teamNummer;
-			ssdrt->linienLänge = 0;
-			ssdrt->kills = 0;
-			ssdrt->tode = 0;
-			for( int k = 0; k < spielerAnzahl; k++ )
-			{
-				VideoSpieler *tmp = spieler->z( j );
-				if( tmp->getTeam() == ssdrt->teamNummer )
-				{
-					ssdrt->linienLänge += tmp->getLinienLänge( i );
-					ssdrt->kills += tmp->getKills( i );
-					ssdrt->tode += tmp->getTodesZeit( i ) != 0;
-				}
-			}
-			ssdr->teams.set( ssdrt, j );
-		}
-		this->ssdr->set( ssdr, i );
-	}
+    nachrichten = new SpielNachricht( spielId );
+    bestenliste = new VideoBestenliste( Framework::defaultUI( 0, 0 ) );
+    map = new VideoKarte();
+    spieler = new RCArray< VideoSpieler >();
+    ssdgs = new Array< SSDGesamtSpieler * >();
+    ssdgt = new Array< SSDGesamtTeam * >();
+    ssdr = new Array< SSDRunde * >();
+    spielerAnzahl = 0;
+    teamAnzahl = 0;
+    rundenAnzahl = 0;
+    Text f;
+    fehler = nachrichten->hatFehler( &f );
+    if( fehler )
+        return;
+    // Spiel Initialisieren
+    spielerAnzahl = nachrichten->getSVD()->spielerAnzahl;
+    teamAnzahl = nachrichten->getTeamAnzahl();
+    int maxTeam = 0;
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        SpielerVideoDaten *dat = nachrichten->getSPVD( i );
+        VideoSpieler *tmp = new VideoSpieler( dat );
+        bestenliste->addSpieler( tmp );
+        spieler->set( tmp, i );
+        maxTeam = maxTeam < dat->team ? dat->team : maxTeam;
+    }
+    maxTeam++;
+    bestenliste->setTeamAnzahl( maxTeam );
+    for( int i = 0; i < nachrichten->getTeamAnzahl(); i++ )
+    {
+        TeamVideoDaten *dat = nachrichten->getTVD( i );
+        bestenliste->setTeamMaxPunkte( dat->teamNummer, dat->maxPunkte );
+        bestenliste->setTeamPunkte( dat->teamNummer, dat->punkte );
+    }
+    RundeVideoDaten *rDat = nachrichten->getRVD();
+    map->setSize( rDat->mapBreite, rDat->mapHöhe );
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        RundeSpielerVideoDaten *dat = nachrichten->getRSVD( i );
+        spieler->z( i )->neuRunde( 1, dat, 1 );
+    }
+    Array< int > rundenSieger;
+    Array< int > rundenDauer;
+    VideoMSG *nMsg = 0;
+    double sZeit = 0;
+    // Spiel nachstellen
+    while( 1 )
+    {
+        while( !nMsg || nMsg->typ )
+        {
+            if( !nMsg )
+                nMsg = nachrichten->GetNextNachricht();
+            if( !nMsg )
+                break;
+            if( !nMsg->typ )
+                break;
+            VideoAktionMSG *ak = (VideoAktionMSG *)nMsg;
+            switch( ak->aktion )
+            {
+            case 0: // T_Links Press
+                for( int i = 0; i < spielerAnzahl; i++ )
+                {
+                    if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
+                    {
+                        spieler->z( i )->setLinksKurve( 1 );
+                        break;
+                    }
+                }
+                break;
+            case 1: // T_Links Release
+                for( int i = 0; i < spielerAnzahl; i++ )
+                {
+                    if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
+                    {
+                        spieler->z( i )->setLinksKurve( 0 );
+                        break;
+                    }
+                }
+                break;
+            case 2: // T_Rechts Press
+                for( int i = 0; i < spielerAnzahl; i++ )
+                {
+                    if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
+                    {
+                        spieler->z( i )->setRechtsKurve( 1 );
+                        break;
+                    }
+                }
+                break;
+            case 3: // T_Rechts Release
+                for( int i = 0; i < spielerAnzahl; i++ )
+                {
+                    if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
+                    {
+                        spieler->z( i )->setRechtsKurve( 0 );
+                        break;
+                    }
+                }
+                break;
+            case 5: // Linien Unterbrechung
+                if( 1 )
+                {
+                    VideoLinieMSG *lMsg = (VideoLinieMSG *)ak;
+                    for( int i = 0; i < spielerAnzahl; i++ )
+                    {
+                        if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
+                        {
+                            spieler->z( i )->setLinienUnterbrechung( lMsg->unterbrechung != 0 );
+                            break;
+                        }
+                    }
+                }
+                break;
+            }
+            nMsg = 0;
+        }
+        if( !nMsg )
+            break;
+        sZeit += TICK;
+        bool rEnd = 0;
+        int tmpTeam = -1;
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            VideoSpieler *tmp = spieler->z( i );
+            if( tmp )
+            {
+                bool amLeben = tmp->istAmLeben();
+                tmp->tick( map->zMap(), TICK );
+                if( amLeben != tmp->istAmLeben() )
+                {
+                    for( int j = 0; j < spielerAnzahl; j++ )
+                    {
+                        VideoSpieler *s = spieler->z( j );
+                        if( s && s->getFarbe() == tmp->getKillFarbe() )
+                            s->addKill();
+                        if( s && s != tmp && s->istAmLeben() )
+                            bestenliste->addPunkt( s->getTeam(), s->getSpielerNummer(), 1 );
+                    }
+                }
+                if( amLeben && !tmp->istAmLeben() )
+                { // gestorben
+                    int team = tmp->getTeam();
+                    bool teamLebt = 0;
+                    for( int k = 0; k < spielerAnzahl; k++ )
+                    {
+                        if( spieler->z( k ) && spieler->z( k )->getTeam() == team )
+                            teamLebt |= spieler->z( k )->istAmLeben();
+                    }
+                    if( !teamLebt )
+                    {
+                        int teamAmLebenAnzahl = 0;
+                        for( int k = 0; k < maxTeam; k++ )
+                        {
+                            if( !bestenliste->teamExistiert( k ) )
+                                continue;
+                            bool amLeben = 0;
+                            for( int l = 0; l < spielerAnzahl; l++ )
+                            {
+                                if( spieler->z( l ) && spieler->z( l )->getTeam() == k )
+                                    amLeben |= spieler->z( l )->istAmLeben();
+                            }
+                            if( amLeben )
+                            {
+                                tmpTeam = k;
+                                teamAmLebenAnzahl++;
+                                bestenliste->addPunkt( k, 1 );
+                            }
+                            else
+                                bestenliste->addPunkt( k, 0 );
+                            if( !bestenliste->getTeamPunkte( k ) )
+                                bestenliste->setTeamStatus( k, "tod", 0xFFFF0000 );
+                        }
+                        if( teamAmLebenAnzahl <= 1 )
+                            rEnd = 1;
+                    }
+                }
+            }
+        }
+        if( rEnd )
+        { // Runden Ende
+            rundenSieger.set( tmpTeam, rundenAnzahl );
+            rundenDauer.set( (int)sZeit, rundenAnzahl );
+            rundenAnzahl++;
+            sZeit = 0;
+            int nAnz = 0;
+            int nAnz2 = 0;
+            for( int i = 0; i < maxTeam; i++ )
+            {
+                if( bestenliste->teamExistiert( i ) )
+                {
+                    nAnz += bestenliste->hatTeamGewonnen( i );
+                    nAnz2 += bestenliste->getTeamPunkte( i ) >= 0;
+                }
+            }
+            if( nAnz || nAnz2 <= 1 || rundenAnzahl >= 10 )
+            {
+                RundeSpielerVideoDaten dat;
+                for( int i = 0; i < spielerAnzahl; i++ )
+                    spieler->z( i )->neuRunde( 1, &dat, 1 );
+                break; // Spiel Ende
+            }
+            int r = nachrichten->setRundenEnde( 1 );
+            bestenliste->updatePunkte();
+            map->nextRunde( 1 );
+            RundeVideoDaten *dat = nachrichten->getRVD();
+            map->setSize( dat->mapBreite, dat->mapHöhe );
+            for( int i = 0; i < spielerAnzahl; i++ )
+                spieler->z( i )->neuRunde( 1, nachrichten->getRSVD( i ), bestenliste->getTeamPunkte( spieler->z( i )->getTeam() ) != 0 );
+        }
+        nMsg = 0;
+    }
+    // Statistik erstellen
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        SSDGesamtSpieler *ssdgs = new SSDGesamtSpieler();
+        VideoSpieler *tmp = spieler->z( i );
+        ssdgs->spielerNummer = tmp->getSpielerNummer();
+        ssdgs->spielerName.setText( tmp->zName()->getText() );
+        ssdgs->teamName.setText( tmp->zTeamName()->getText() );
+        ssdgs->spielerFarbe = tmp->getFarbe();
+        ssdgs->teamFarbe = tmp->getTeamFarbe();
+        ssdgs->gewonneneRunden = tmp->getGewonneneRunden();
+        ssdgs->punkte = bestenliste->getSpielerPunkte( tmp->getTeam(), tmp->getSpielerNummer() );
+        ssdgs->linienLänge = tmp->getLinienLänge();
+        ssdgs->zeitAmLeben = tmp->getZeitAmLeben();
+        ssdgs->zeitTod = tmp->getZeitTod();
+        ssdgs->kills = tmp->getKills();
+        ssdgs->tode = tmp->getTode();
+        this->ssdgs->set( ssdgs, i );
+    }
+    Array< int > teams;
+    for( int i = 0; i < teamAnzahl; i++ )
+    {
+        for( int j = 0; j < spielerAnzahl; j++ )
+        {
+            if( teams.getWertIndex( spieler->z( j )->getTeam() ) < 0 )
+            {
+                teams.set( spieler->z( j )->getTeam(), i );
+                break;
+            }
+        }
+        if( teams.hat( i ) )
+        {
+            SSDGesamtTeam *ssdgt = new SSDGesamtTeam();
+            ssdgt->teamNummer = teams.get( i );
+            for( int j = 0; j < spielerAnzahl; j++ )
+            {
+                VideoSpieler *tmp = spieler->z( j );
+                if( tmp->getTeam() == ssdgt->teamNummer )
+                {
+                    ssdgt->teamName.setText( tmp->zTeamName()->getText() );
+                    ssdgt->teamFarbe = tmp->getTeamFarbe();
+                    break;
+                }
+            }
+            ssdgt->gewonneneRunden = 0;
+            for( int j = 0; j < rundenAnzahl; j++ )
+            {
+                if( rundenSieger.get( j ) == ssdgt->teamNummer )
+                    ssdgt->gewonneneRunden++;
+            }
+            ssdgt->punkte = 0;
+            ssdgt->linienLänge = 0;
+            ssdgt->kills = 0;
+            ssdgt->tode = 0;
+            for( int j = 0; j < spielerAnzahl; j++ )
+            {
+                VideoSpieler *tmp = spieler->z( j );
+                if( tmp->getTeam() == ssdgt->teamNummer )
+                {
+                    ssdgt->punkte += bestenliste->getSpielerPunkte( tmp->getTeam(), tmp->getSpielerNummer() );
+                    ssdgt->linienLänge += tmp->getLinienLänge();
+                    ssdgt->kills += tmp->getKills();
+                    ssdgt->tode += tmp->getTode();
+                }
+            }
+            this->ssdgt->set( ssdgt, i );
+        }
+    }
+    for( int i = 0; i < rundenAnzahl; i++ )
+    {
+        SSDRunde *ssdr = new SSDRunde();
+        ssdr->rundenNummer = i;
+        ssdr->rundenDauer = rundenDauer.get( i );
+        ssdr->rundenSieger = rundenSieger.get( i );
+        ssdr->rundenBild.neuBild( map->zMap( i )->getBreite(), map->zMap( i )->getHeight(), 0 );
+        ssdr->rundenBild.drawBild( 0, 0, map->zMap( i )->getBreite(), map->zMap( i )->getHeight(), *map->zMap( i ) );
+        ssdr->spielfeldNutzung = 0;
+        int *rbBuff = ssdr->rundenBild.getBuffer();
+        for( int j = 0; j < ssdr->rundenBild.getBreite() * ssdr->rundenBild.getHeight(); j++ )
+        {
+            if( rbBuff[ j ] )
+                ssdr->spielfeldNutzung++;
+        }
+        ssdr->spielfeldNutzung = (int)( ( ssdr->spielfeldNutzung / ( (double)( ssdr->rundenBild.getBreite() * ssdr->rundenBild.getHeight() ) / 25 ) ) * 100 );
+        for( int j = 0; j < spielerAnzahl; j++ )
+        {
+            VideoSpieler *tmp = spieler->z( j );
+            SSDRundeSpieler *ssdrs = new SSDRundeSpieler();
+            ssdrs->spielerNummer = tmp->getSpielerNummer();
+            ssdrs->spielerName.setText( tmp->zName()->getText() );
+            ssdrs->teamName.setText( tmp->zTeamName()->getText() );
+            ssdrs->spielerFarbe = tmp->getFarbe();
+            ssdrs->teamFarbe = tmp->getTeamFarbe();
+            ssdrs->linienLänge = tmp->getLinienLänge( i );
+            ssdrs->kills = tmp->getKills( i );
+            ssdrs->todesZeit = tmp->getTodesZeit( i );
+            ssdr->spieler.set( ssdrs, j );
+        }
+        for( int j = 0; j < teamAnzahl; j++ )
+        {
+            SSDRundeTeam *ssdrt = new SSDRundeTeam();
+            ssdrt->teamNummer = teams.get( j );
+            for( int k = 0; k < spielerAnzahl; k++ )
+            {
+                if( spieler->z( k )->getTeam() == ssdrt->teamNummer )
+                {
+                    ssdrt->teamName.setText( spieler->z( k )->zTeamName()->getText() );
+                    ssdrt->teamFarbe = spieler->z( k )->getTeamFarbe();
+                    break;
+                }
+            }
+            ssdrt->ergebnis = rundenSieger.get( i ) == ssdrt->teamNummer;
+            ssdrt->linienLänge = 0;
+            ssdrt->kills = 0;
+            ssdrt->tode = 0;
+            for( int k = 0; k < spielerAnzahl; k++ )
+            {
+                VideoSpieler *tmp = spieler->z( j );
+                if( tmp->getTeam() == ssdrt->teamNummer )
+                {
+                    ssdrt->linienLänge += tmp->getLinienLänge( i );
+                    ssdrt->kills += tmp->getKills( i );
+                    ssdrt->tode += tmp->getTodesZeit( i ) != 0;
+                }
+            }
+            ssdr->teams.set( ssdrt, j );
+        }
+        this->ssdr->set( ssdr, i );
+    }
 }
 
 // Destruktor
 StatistikLeser::~StatistikLeser()
 {
-	nachrichten->release();
-	bestenliste->release();
-	map->release();
-	spieler->release();
-	ssdgs->release();
-	ssdgt->release();
-	ssdr->release();
+    nachrichten->release();
+    bestenliste->release();
+    map->release();
+    spieler->release();
+    ssdgs->release();
+    ssdgt->release();
+    ssdr->release();
 }
 
 // constant
 bool StatistikLeser::hatFehler() const
 {
-	return fehler;
+    return fehler;
 }
 
 int StatistikLeser::getSpielerAnzahl() const
 {
-	return spielerAnzahl;
+    return spielerAnzahl;
 }
 
 int StatistikLeser::getTeamAnzahl() const
 {
-	return teamAnzahl;
+    return teamAnzahl;
 }
 
 int StatistikLeser::getRundenAnzahl() const
 {
-	return rundenAnzahl;
+    return rundenAnzahl;
 }
 
 SSDGesamtSpieler *StatistikLeser::getSSDGS( int index ) const
 {
-	return ssdgs->get( index );
+    return ssdgs->get( index );
 }
 
 SSDGesamtTeam *StatistikLeser::getSSDGT( int index ) const
 {
-	return ssdgt->get( index );
+    return ssdgt->get( index );
 }
 
 SSDRunde *StatistikLeser::getSSDR( int runde ) const
 {
-	return ssdr->get( runde );
-}
-
-// Reference Counting
-StatistikLeser *StatistikLeser::getThis()
-{
-	ref++;
-	return this;
-}
-
-StatistikLeser *StatistikLeser::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return ssdr->get( runde );
 }

+ 24 - 28
Linie/HistorieStatistik/StatistikLeser.h

@@ -7,38 +7,34 @@
 #include "../Aufzeichnung/Nachricht/VideoNachricht.h"
 #include "../SpielStatistik/SpielStatistikDaten.h"
 
-class StatistikLeser
+class StatistikLeser : public virtual ReferenceCounter
 {
 private:
-	SpielNachricht *nachrichten;
-	VideoBestenliste *bestenliste;
-	VideoKarte *map;
-	RCArray< VideoSpieler > *spieler;
-	Array< SSDGesamtSpieler* > *ssdgs;
-	Array< SSDGesamtTeam* > *ssdgt;
-	Array< SSDRunde* > *ssdr;
-	int spielerAnzahl;
-	int teamAnzahl;
-	int rundenAnzahl;
-	bool fehler;
-	int ref;
+    SpielNachricht *nachrichten;
+    VideoBestenliste *bestenliste;
+    VideoKarte *map;
+    RCArray< VideoSpieler > *spieler;
+    Array< SSDGesamtSpieler * > *ssdgs;
+    Array< SSDGesamtTeam * > *ssdgt;
+    Array< SSDRunde * > *ssdr;
+    int spielerAnzahl;
+    int teamAnzahl;
+    int rundenAnzahl;
+    bool fehler;
 
 public:
-	// Konstruktor
-	StatistikLeser( int spielId );
-	// Destruktor
-	~StatistikLeser();
-	// constant
-	bool hatFehler() const;
-	int getSpielerAnzahl() const;
-	int getTeamAnzahl() const;
-	int getRundenAnzahl() const;
-	SSDGesamtSpieler *getSSDGS( int index ) const;
-	SSDGesamtTeam *getSSDGT( int index ) const;
-	SSDRunde *getSSDR( int runde ) const;
-	// Reference Counting
-	StatistikLeser *getThis();
-	StatistikLeser *release();
+    // Konstruktor
+    StatistikLeser( int spielId );
+    // Destruktor
+    ~StatistikLeser();
+    // constant
+    bool hatFehler() const;
+    int getSpielerAnzahl() const;
+    int getTeamAnzahl() const;
+    int getRundenAnzahl() const;
+    SSDGesamtSpieler *getSSDGS( int index ) const;
+    SSDGesamtTeam *getSSDGT( int index ) const;
+    SSDRunde *getSSDR( int runde ) const;
 };
 
 #endif

+ 0 - 215
Linie/Initialisierung/Initialisierung.cpp

@@ -1,215 +0,0 @@
-#include "Initialisierung.h"
-#include <ToolTip.h>
-#include <Bildschirm.h>
-#include <MausEreignis.h>
-
-Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, int style, char *titel )
-{
-    Knopf *ret = new Knopf();
-    ret->addStyle( style );
-    ret->setPosition( x, y );
-    ret->setSize( br, hö );
-    if( zSchrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
-    if( titel )
-        ret->setText( titel );
-    return ret;
-}
-
-KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift *zSchrift, int style, char *txt )
-{
-    KontrollKnopf *ret = new KontrollKnopf();
-    ret->addStyle( style );
-    if( zSchrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
-    if( txt )
-    {
-        ret->setText( txt );
-        ret->setSText( txt );
-    }
-    ret->setSFarbe( 0xFFFFFFFF );
-    ret->setSSize( 12 );
-    if( ret->hatStyle( TextFeld::Style::Buffered ) )
-    {
-        ret->setAlphaFeldFarbe( 0x5500FF00 );
-        ret->setAlphaFeldStrength( -5 );
-    }
-    if( ret->hatStyle( TextFeld::Style::Rahmen ) )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFF00FF00 );
-    }
-    ret->setPosition( x, y );
-    ret->setSize( br, hö );
-    ret->loadData( "data/bilder/system.ltdb" );
-    return ret;
-}
-
-Fenster *initFenster( int x, int y, int br, int hö, Schrift *zSchrift, int style, char *titel )
-{
-    Fenster *ret = new Fenster();
-    ret->addStyle( style );
-    ret->setPosition( x, y );
-    ret->setSize( br, hö );
-    if( ret->hatStyle( Fenster::Style::Rahmen ) )
-    {
-        ret->setRBreite( 1 );
-        ret->setRFarbe( 0xFFFFFFFF );
-    }
-    if( ret->hatStyle( Fenster::Style::Titel ) )
-    {
-        if( titel )
-            ret->setTitel( titel );
-        if( zSchrift )
-            ret->setTSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
-        ret->setTSFarbe( 0xFFFFFFFF );
-        ret->zTTextFeld()->setSize( 0, 20 );
-        ret->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
-        ret->setTRFarbe( 0xFF00FF00 );
-        ret->setTRBreite( 1 );
-        if( ret->hatStyle( Fenster::Style::TitelBuffered ) )
-        {
-            ret->setTAfFarbe( 0x1000FF00 );
-            ret->setTAfStrength( -15 );
-        }
-    }
-    return ret;
-}
-
-TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift *zSchrift, int style, char *txt )
-{
-    TextFeld *ret = new TextFeld();
-    ret->setStyle( style );
-    if( zSchrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
-    if( txt )
-        ret->setText( txt );
-    ret->setSchriftFarbe( 0xFFFFFFFF );
-    ret->setSchriftSize( 12 );
-    if( ret->hatStyle( TextFeld::Style::Buffered ) )
-    {
-        ret->setAlphaFeldFarbe( 0x5500FF00 );
-        ret->setAlphaFeldStrength( -5 );
-    }
-    if( ret->hatStyle( TextFeld::Style::Rahmen ) )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFF00FF00 );
-    }
-    ret->setPosition( x, y );
-    ret->setSize( br, hö );
-    return ret;
-}
-
-BildZ *initBildZ( int x, int y, int br, int hö, int style, Bild *b )
-{
-    BildZ *ret = new BildZ();
-    ret->setStyle( style );
-    ret->setPosition( x, y );
-    ret->setSize( br, hö );
-    if( b )
-        ret->setBildZ( b );
-    if( ( style | BildZ::Style::Rahmen ) == style )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-    }
-    return ret;
-}
-
-AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift *zSchrift, int style, std::initializer_list< char * > values )
-{
-    AuswahlBox *ret = new AuswahlBox();
-    ret->addStyle( style );
-    ret->setPosition( x, y );
-    ret->setSize( br, hö );
-    if( ( style | AuswahlBox::Style::Hintergrund ) == style )
-        ret->setHintergrundFarbe( 0xFF000000 );
-    if( ( style | AuswahlBox::Style::Erlaubt ) == style )
-        ret->setMausEreignis( _ret1ME );
-    if( zSchrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
-    if( ( style | AuswahlBox::Style::Rahmen ) == style )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-    }
-    if( ( style | AuswahlBox::Style::MaxHeight ) == style )
-        ret->setMaxAuskappHeight( 100 );
-    if( ( style | AuswahlBox::Style::MausRahmen ) == style )
-    {
-        ret->setMausRahmenBreite( 1 );
-        ret->setMausRahmenFarbe( 0xFF005500 );
-    }
-    if( ( style | AuswahlBox::Style::MausBuffer ) == style )
-    {
-        ret->setMausAlphaFeldFarbe( 0x00008700 );
-        ret->setMausAlphaFeldStrength( -8 );
-    }
-    if( ( style | AuswahlBox::Style::AuswahlRahmen ) == style )
-    {
-        ret->setAuswRahmenBreite( 1 );
-        ret->setAuswRahmenFarbe( 0xFF00FF00 );
-    }
-    if( ( style | AuswahlBox::Style::AuswahlBuffer ) == style )
-    {
-        ret->setAuswAlphaFeldFarbe( 0x0000FF00 );
-        ret->setAuswAlphaFeldStrength( -8 );
-    }
-    for( auto i = values.begin(); i != values.end(); i++ )
-    {
-        ret->addEintrag( *i );
-    }
-    return ret;
-}
-
-ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift *zSchrift, int style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe )
-{
-    ObjTabelle *ret = new ObjTabelle();
-    ret->addStyle( style );
-    ret->setPosition( x, y );
-    ret->setSize( br, hö );
-    if( ( style | ObjTabelle::Style::Erlaubt ) == style )
-        ret->setMausEreignis( _ret1ME );
-    if( ( style | ObjTabelle::Style::Rahmen ) == style )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-    }
-    if( ( style | ObjTabelle::Style::Raster ) == style )
-    {
-        ret->setRasterBreite( 1 );
-        ret->setRasterFarbe( 0xFFFFFFFF );
-    }
-    if( ( style | ObjTabelle::Style::VScroll ) == style )
-        ret->setVertikalKlickScroll( 5 );
-    if( ( style | ObjTabelle::Style::HScroll ) == style )
-        ret->setHorizontalKlickScroll( 5 );
-    for( auto i = spalten.begin(); i != spalten.end(); i++ )
-    {
-        ret->addSpalte( i->name );
-        ret->setSpaltenBreite( i->name, i->breite );
-        if( ( style | ObjTabelle::Style::SpaltenBreiteMin ) == style )
-            ret->setMinSpaltenBreite( i->name, i->minBreite );
-        if( ( style | ObjTabelle::Style::SpaltenBreiteMax ) == style )
-            ret->setMaxSpaltenBreite( i->name, i->maxBreite );
-        if( überschriftHöhe )
-        {
-            if( ret->getZeilenNummer( "Überschrift" ) < 0 )
-            {
-                ret->addZeile( 0, "Überschrift" );
-                ret->setZeilenHeight( 0, 20 );
-            }
-            ret->setZeichnungZ( i->name, "Überschrift", initTextFeld( 0, 0, i->breite, 20, zSchrift, TextFeld::Style::Text, i->name ) );
-        }
-    }
-    return ret;
-}
-
-void initToolTip( Zeichnung *obj, const char *txt, Schrift *zSchrift, Bildschirm *zBs )
-{
-    obj->setToolTipText( txt, zBs, zSchrift );
-    obj->zToolTip()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Hintergrund | TextFeld::Style::HAlpha | TextFeld::Style::Mehrzeilig );
-    obj->zToolTip()->setHintergrundFarbe( 0xA0000000 );
-    obj->zToolTip()->setRahmenFarbe( 0xFFFFFFFF );
-}

+ 0 - 32
Linie/Initialisierung/Initialisierung.h

@@ -1,32 +0,0 @@
-#ifndef Initialisierung_H
-#define Initialisierung_H
-
-#include <Knopf.h>
-#include <Fenster.h>
-#include <TextFeld.h>
-#include <Schrift.h>
-#include <Bild.h>
-#include <AuswahlBox.h>
-#include <Tabelle.h>
-#include <initializer_list>
-
-using namespace Framework;
-
-struct OBJTabelleSpalteIni
-{
-	char *name;
-	int breite;
-	int minBreite;
-	int maxBreite;
-};
-
- Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, int style, char *titel );
- KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift *zSchrift, int style, char *txt );
- Fenster *initFenster( int x, int y, int br, int hö, Schrift *zSchrift, int style, char *titel );
- TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift *zSchrift, int style, char *txt );
- BildZ *initBildZ( int x, int y, int br, int hö, int style, Bild *b );
- AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift *zSchrift, int style, std::initializer_list< char * > values );
- ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift *zSchrift, int style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe );
- void initToolTip( Zeichnung *obj, const char *txt, Schrift *zSchrift, Bildschirm *zBs );
-
-#endif

+ 0 - 2
Linie/Linie.vcxproj

@@ -186,7 +186,6 @@
     <ClInclude Include="Aufzeichnung\VideoDaten\VideoDaten.h" />
     <ClInclude Include="HistorieStatistik\HistorieStatistik.h" />
     <ClInclude Include="HistorieStatistik\StatistikLeser.h" />
-    <ClInclude Include="Initialisierung\Initialisierung.h" />
     <ClInclude Include="Netzwerk\STKNachricht.h" />
     <ClInclude Include="SpielStatistik\Chat\StatistikChat.h" />
     <ClInclude Include="SpielStatistik\Runde\StatistikRunde.h" />
@@ -214,7 +213,6 @@
     <ClCompile Include="Aufzeichnung\Steuerung\VideoSteuerung.cpp" />
     <ClCompile Include="HistorieStatistik\HistorieStatistik.cpp" />
     <ClCompile Include="HistorieStatistik\StatistikLeser.cpp" />
-    <ClCompile Include="Initialisierung\Initialisierung.cpp" />
     <ClCompile Include="Netzwerk\STKNachricht.cpp" />
     <ClCompile Include="SpielStatistik\Chat\StatistikChat.cpp" />
     <ClCompile Include="SpielStatistik\Runde\StatistikRunde.cpp" />

+ 0 - 6
Linie/Linie.vcxproj.filters

@@ -45,9 +45,6 @@
     <ClInclude Include="SpielStatistik\SpielStatistik.h">
       <Filter>Headerdateien</Filter>
     </ClInclude>
-    <ClInclude Include="Initialisierung\Initialisierung.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
     <ClInclude Include="SpielStatistik\SpielStatistikDaten.h">
       <Filter>Headerdateien</Filter>
     </ClInclude>
@@ -131,9 +128,6 @@
     <ClCompile Include="SpielStatistik\SpielStatistik.cpp">
       <Filter>Quelldateien</Filter>
     </ClCompile>
-    <ClCompile Include="Initialisierung\Initialisierung.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
     <ClCompile Include="SpielStatistik\Chat\StatistikChat.cpp">
       <Filter>Quelldateien</Filter>
     </ClCompile>

+ 13 - 28
Linie/Netzwerk/STKNachricht.cpp

@@ -3,60 +3,45 @@
 // Inhalt der STKNachricht Klasse aus STKNachricht.h
 // Konstruktor
 STKNachricht::STKNachricht( int län, char *nachricht )
+    : ReferenceCounter()
 {
-	verarbeitet = 0;
-	spielZeit = *(double*)nachricht;
-	this->län = län - 8;
-	this->nachricht = new char[ this->län ];
-	for( int i = 0; i < this->län; i++ )
-		this->nachricht[ i ] = nachricht[ i + 8 ];
-	ref = 1;
+    verarbeitet = 0;
+    spielZeit = *(double *)nachricht;
+    this->län = län - 8;
+    this->nachricht = new char[ this->län ];
+    for( int i = 0; i < this->län; i++ )
+        this->nachricht[ i ] = nachricht[ i + 8 ];
 }
 
 // Destruktor
 STKNachricht::~STKNachricht()
 {
-	delete[] nachricht;
+    delete[] nachricht;
 }
 
 // nicht constant
 void STKNachricht::setVerarbeitet()
 {
-	verarbeitet = 1;
+    verarbeitet = 1;
 }
 
 // constant
 bool STKNachricht::istVerarbeitet() const
 {
-	return verarbeitet;
+    return verarbeitet;
 }
 
 double STKNachricht::getSpielZeit() const
 {
-	return spielZeit;
+    return spielZeit;
 }
 
 int STKNachricht::getLength() const
 {
-	return län;
+    return län;
 }
 
 char *STKNachricht::getNachricht() const
 {
-	return nachricht;
-}
-
-// Reference Counting
-STKNachricht *STKNachricht::getThis()
-{
-	ref++;
-	return this;
-}
-
-STKNachricht *STKNachricht::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return nachricht;
 }

+ 18 - 20
Linie/Netzwerk/STKNachricht.h

@@ -1,30 +1,28 @@
 #ifndef STKNachricht_H
 #define STKNachricht_H
 
-class STKNachricht
+#include <ReferenceCounter.h>
+
+class STKNachricht : public virtual Framework::ReferenceCounter
 {
 private:
-	double spielZeit;
-	int län;
-	char *nachricht;
-	bool verarbeitet;
-	int ref;
+    double spielZeit;
+    int län;
+    char *nachricht;
+    bool verarbeitet;
 
 public:
-	// Konstruktor
-	STKNachricht( int län, char *nachricht );
-	// Destruktor
-	~STKNachricht();
-	// nicht constant
-	void setVerarbeitet();
-	// constant
-	bool istVerarbeitet() const;
-	double getSpielZeit() const;
-	int getLength() const;
-	char *getNachricht() const;
-	// Reference Counting
-	STKNachricht *getThis();
-	STKNachricht *release();
+    // Konstruktor
+    STKNachricht( int län, char *nachricht );
+    // Destruktor
+    ~STKNachricht();
+    // nicht constant
+    void setVerarbeitet();
+    // constant
+    bool istVerarbeitet() const;
+    double getSpielZeit() const;
+    int getLength() const;
+    char *getNachricht() const;
 };
 
 #endif

+ 22 - 99
Linie/Spiel/Bestenliste/Bestenliste.cpp

@@ -7,7 +7,8 @@
 
 // Inhalt der BLSpieler Klasse aus Bestenliste.h
 // Konstruktor
-BLSpieler::BLSpieler( int sNum, int farbe, Schrift *zS )
+BLSpieler::BLSpieler( int sNum, int farbe, UIInit &uiFactory )
+    : ReferenceCounter()
 {
     this->sNum = sNum;
     this->farbe = farbe;
@@ -19,43 +20,33 @@ BLSpieler::BLSpieler( int sNum, int farbe, Schrift *zS )
     rahmen->setRamenBreite( 1 );
     rahmen->setSize( 400, 20 );
 
-    name = new TextFeld();
+    name = uiFactory.createTextFeld( uiFactory.initParam );
     name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    name->setSchriftZ( dynamic_cast<Schrift *>( zS->getThis() ) );
     name->setSchriftFarbe( farbe );
-    name->setSchriftSize( 12 );
     name->setSize( 100, 20 );
     name->setPosition( 0, 0 );
     name->setText( "" );
 
-    punkte = new TextFeld();
+    punkte = uiFactory.createTextFeld( uiFactory.initParam );
     punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    punkte->setSchriftZ( dynamic_cast<Schrift *>( zS->getThis() ) );
     punkte->setSchriftFarbe( farbe );
-    punkte->setSchriftSize( 12 );
     punkte->setSize( 100, 20 );
     punkte->setPosition( 100, 0 );
     punkte->setText( "" );
 
-    neuPunkte = new TextFeld();
+    neuPunkte = uiFactory.createTextFeld( uiFactory.initParam );
     neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    neuPunkte->setSchriftZ( dynamic_cast<Schrift *>( zS->getThis() ) );
     neuPunkte->setSchriftFarbe( farbe );
-    neuPunkte->setSchriftSize( 12 );
     neuPunkte->setSize( 100, 20 );
     neuPunkte->setPosition( 200, 0 );
     neuPunkte->setText( "" );
 
-    status = new TextFeld();
+    status = uiFactory.createTextFeld( uiFactory.initParam );
     status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    status->setSchriftZ( dynamic_cast<Schrift *>( zS->getThis() ) );
     status->setSchriftFarbe( 0xFF00FF00 );
-    status->setSchriftSize( 12 );
     status->setSize( 100, 20 );
     status->setPosition( 300, 0 );
     status->setText( "lebt" );
-
-    ref = 1;
 }
 
 // Destruktor
@@ -147,24 +138,10 @@ int BLSpieler::getPunkte() const
     return p + nP;
 }
 
-// Reference Counting
-BLSpieler *BLSpieler::getThis()
-{
-    ref++;
-    return this;
-}
-
-BLSpieler *BLSpieler::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der BLTeam Klasse aus Bestenliste.h
 // Konstruktor
-BLTeam::BLTeam( int id, int farbe, Schrift *s )
+BLTeam::BLTeam( int id, int farbe, UIInit &uiFactory )
+    : ReferenceCounter()
 {
     teamId = id;
     spielerAnzahl = 0;
@@ -172,7 +149,7 @@ BLTeam::BLTeam( int id, int farbe, Schrift *s )
     mP = 0;
     nP = 0;
     this->farbe = farbe;
-    schrift = s;
+    this->uiFactory = uiFactory;
 
     rahmen = new LRahmen();
     rahmen->setFarbe( farbe );
@@ -180,49 +157,38 @@ BLTeam::BLTeam( int id, int farbe, Schrift *s )
 
     spieler = new RCArray< BLSpieler >();
 
-    name = new TextFeld();
+    name = uiFactory.createTextFeld( uiFactory.initParam );
     name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    name->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
     name->setSchriftFarbe( farbe );
-    name->setSchriftSize( 12 );
     name->setSize( 100, 20 );
     name->setPosition( 0, 0 );
     name->setText( "" );
 
-    punkte = new TextFeld();
+    punkte = uiFactory.createTextFeld( uiFactory.initParam );
     punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    punkte->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
     punkte->setSchriftFarbe( farbe );
-    punkte->setSchriftSize( 12 );
     punkte->setSize( 100, 20 );
     punkte->setPosition( 100, 0 );
     punkte->setText( "" );
 
-    neuPunkte = new TextFeld();
+    neuPunkte = uiFactory.createTextFeld( uiFactory.initParam );
     neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    neuPunkte->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
     neuPunkte->setSchriftFarbe( farbe );
-    neuPunkte->setSchriftSize( 12 );
     neuPunkte->setSize( 100, 20 );
     neuPunkte->setPosition( 200, 0 );
     neuPunkte->setText( "" );
 
-    status = new TextFeld();
+    status = uiFactory.createTextFeld( uiFactory.initParam );
     status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    status->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
     status->setSchriftFarbe( 0xFF00FF00 );
-    status->setSchriftSize( 12 );
     status->setSize( 100, 20 );
     status->setPosition( 300, 0 );
     status->setText( "lebt" );
-
-    ref = 1;
 }
 
 // Destruktor
 BLTeam::~BLTeam()
 {
-    schrift->release();
     rahmen->release();
     spieler->release();
     name->release();
@@ -245,7 +211,7 @@ bool BLTeam::addSpieler( Spieler *zSpieler )
     }
     if( gefunden )
         return 0;
-    BLSpieler *tmp = new BLSpieler( zSpieler->getSpielerNummer(), zSpieler->getFarbe(), schrift );
+    BLSpieler *tmp = new BLSpieler( zSpieler->getSpielerNummer(), zSpieler->getFarbe(), uiFactory );
     spieler->set( tmp, spielerAnzahl );
     spielerAnzahl++;
     return 1;
@@ -411,24 +377,10 @@ int BLTeam::getHeight() const
     return 21 + spielerAnzahl * 20;
 }
 
-// Reference Counting
-BLTeam *BLTeam::getThis()
-{
-    ref++;
-    return this;
-}
-
-BLTeam *BLTeam::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der Bestenliste Klasse aus Bestenliste.h
 // Konstruktor
-Bestenliste::Bestenliste( Schrift *s )
+Bestenliste::Bestenliste( UIInit &uiFactory )
+    : ReferenceCounter()
 {
     rahmen = new LRahmen();
     rahmen->setRamenBreite( 1 );
@@ -437,38 +389,26 @@ Bestenliste::Bestenliste( Schrift *s )
 
     teams = new RCArray< BLTeam >();
 
-    name = new TextFeld();
+    name = uiFactory.createTextFeld( uiFactory.initParam );
     name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    name->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
-    name->setSchriftFarbe( 0xFFFFFFFF );
-    name->setSchriftSize( 12 );
     name->setText( "Name" );
     name->setSize( 100, 20 );
     name->setPosition( 0, 0 );
 
-    punkte = new TextFeld();
+    punkte = uiFactory.createTextFeld( uiFactory.initParam );
     punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    punkte->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
-    punkte->setSchriftFarbe( 0xFFFFFFFF );
-    punkte->setSchriftSize( 12 );
     punkte->setText( "Punkte" );
     punkte->setSize( 100, 20 );
     punkte->setPosition( 100, 0 );
 
-    neuPunkte = new TextFeld();
+    neuPunkte = uiFactory.createTextFeld( uiFactory.initParam );
     neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    neuPunkte->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
-    neuPunkte->setSchriftFarbe( 0xFFFFFFFF );
-    neuPunkte->setSchriftSize( 12 );
     neuPunkte->setText( "+Punkte" );
     neuPunkte->setSize( 100, 20 );
     neuPunkte->setPosition( 200, 0 );
 
-    status = new TextFeld();
+    status = uiFactory.createTextFeld( uiFactory.initParam );
     status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    status->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
-    status->setSchriftFarbe( 0xFFFFFFFF );
-    status->setSchriftSize( 12 );
     status->setText( "Status" );
     status->setSize( 100, 20 );
     status->setPosition( 300, 0 );
@@ -476,10 +416,9 @@ Bestenliste::Bestenliste( Schrift *s )
     scroll = new VScrollBar();
     scroll->setKlickScroll( 7 );
 
-    schrift = s;
+    this->uiFactory = uiFactory;
     update = 0;
     teamAnzahl = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -492,7 +431,6 @@ Bestenliste::~Bestenliste()
     neuPunkte->release();
     status->release();
     scroll->release();
-    schrift->release();
 }
 
 // nicht constant
@@ -513,7 +451,7 @@ void Bestenliste::addSpieler( Spieler *zSpieler )
     if( team < 0 )
         return;
     if( !teams->z( team ) )
-        teams->set( new BLTeam( team, zSpieler->getTeamFarbe(), dynamic_cast<Schrift *>( schrift->getThis() ) ), team );
+        teams->set( new BLTeam( team, zSpieler->getTeamFarbe(), uiFactory ), team );
     teams->z( team )->addSpieler( zSpieler );
 }
 
@@ -636,19 +574,4 @@ bool Bestenliste::teamExistiert( int team ) const
 int Bestenliste::getTeamPunkte( int team ) const
 {
     return teams->z( team ) ? teams->z( team )->getPunkte() : 0;
-}
-
-// Reference Counting
-Bestenliste *Bestenliste::getThis()
-{
-    ref++;
-    return this;
-}
-
-Bestenliste *Bestenliste::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 91 - 102
Linie/Spiel/Bestenliste/Bestenliste.h

@@ -4,129 +4,118 @@
 #include <TextFeld.h>
 #include <Array.h>
 #include <Rahmen.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
 class Spieler; // Spieler.h
 
-class BLSpieler
+class BLSpieler : public virtual ReferenceCounter
 {
 private:
-	int sNum;
-	int farbe;
-	int p;
-	int nP;
-	Rahmen *rahmen;
-	TextFeld *name;
-	TextFeld *punkte;
-	TextFeld *neuPunkte;
-	TextFeld *status;
-	int ref;
+    int sNum;
+    int farbe;
+    int p;
+    int nP;
+    Rahmen *rahmen;
+    TextFeld *name;
+    TextFeld *punkte;
+    TextFeld *neuPunkte;
+    TextFeld *status;
 
 public:
-	// Konstruktor
-	BLSpieler( int sNum, int farbe, Schrift *zS );
-	// Destruktor
-	~BLSpieler();
-	// nicht constant
-	bool updateStatus( Spieler *zSpieler );
-	void setPunkte( int p );
-	void addPunkt( bool plus );
-	void updatePunkte();
-	void render( int y, Bild &zRObj );
-	// constant
-	int getSpielerNummer() const;
-	int getPunkte() const;
-	// Reference Counting
-	BLSpieler *getThis();
-	BLSpieler *release();
+    // Konstruktor
+    BLSpieler( int sNum, int farbe, UIInit &uiFactory );
+    // Destruktor
+    ~BLSpieler();
+    // nicht constant
+    bool updateStatus( Spieler *zSpieler );
+    void setPunkte( int p );
+    void addPunkt( bool plus );
+    void updatePunkte();
+    void render( int y, Bild &zRObj );
+    // constant
+    int getSpielerNummer() const;
+    int getPunkte() const;
 };
 
-class BLTeam
+class BLTeam : public virtual ReferenceCounter
 {
 private:
-	int teamId;
-	int spielerAnzahl;
-	int p;
-	int mP;
-	int nP;
-	int farbe;
-	Schrift *schrift;
-	LRahmen *rahmen;
-	RCArray< BLSpieler > *spieler;
-	TextFeld *name;
-	TextFeld *punkte;
-	TextFeld *neuPunkte;
-	TextFeld *status;
-	int ref;
+    int teamId;
+    int spielerAnzahl;
+    int p;
+    int mP;
+    int nP;
+    int farbe;
+    UIInit uiFactory;
+    LRahmen *rahmen;
+    RCArray< BLSpieler > *spieler;
+    TextFeld *name;
+    TextFeld *punkte;
+    TextFeld *neuPunkte;
+    TextFeld *status;
 
 public:
-	// Konstruktor
-	BLTeam( int id, int farbe, Schrift *s );
-	// Destruktor
-	~BLTeam();
-	// nicht constant
-	bool addSpieler( Spieler *zSpieler );
-	void setName( char *name );
-	bool updateSpielerStatus( Spieler *zSpieler );
-	void setStatus( const char *txt, int f );
-	void setPunkte( int p );
-	void setMaxPunkte( int mP );
-	bool setSpielerPunkte( int sNum, int p );
-	void addPunkt( bool plus );
-	bool addPunkt( int sNum, bool plus );
-	void updatePunkte();
-	void render( int y, Bild &zRObj );
-	// constant
-	int getSpielerAnzahl() const;
-	int getPunkte() const;
-	int getHeight() const;
-	// Reference Counting
-	BLTeam *getThis();
-	BLTeam *release();
+    // Konstruktor
+    BLTeam( int id, int farbe, UIInit &uiFactory );
+    // Destruktor
+    ~BLTeam();
+    // nicht constant
+    bool addSpieler( Spieler *zSpieler );
+    void setName( char *name );
+    bool updateSpielerStatus( Spieler *zSpieler );
+    void setStatus( const char *txt, int f );
+    void setPunkte( int p );
+    void setMaxPunkte( int mP );
+    bool setSpielerPunkte( int sNum, int p );
+    void addPunkt( bool plus );
+    bool addPunkt( int sNum, bool plus );
+    void updatePunkte();
+    void render( int y, Bild &zRObj );
+    // constant
+    int getSpielerAnzahl() const;
+    int getPunkte() const;
+    int getHeight() const;
 };
 
-class Bestenliste
+class Bestenliste : public virtual ReferenceCounter
 {
 private:
-	LRahmen *rahmen;
-	RCArray< BLTeam > *teams;
-	TextFeld *name;
-	TextFeld *punkte;
-	TextFeld *neuPunkte;
-	TextFeld *status;
-	VScrollBar *scroll;
-	Schrift *schrift;
-	bool update;
-	int teamAnzahl;
-	int ref;
+    LRahmen *rahmen;
+    RCArray< BLTeam > *teams;
+    TextFeld *name;
+    TextFeld *punkte;
+    TextFeld *neuPunkte;
+    TextFeld *status;
+    VScrollBar *scroll;
+    UIInit uiFactory;
+    bool update;
+    int teamAnzahl;
 
 public:
-	// Konstruktor
-	Bestenliste( Schrift *s );
-	// Destruktor
-	~Bestenliste();
-	// nicht constant
-	void setTeamAnzahl( int anz );
-	void addSpieler( Spieler *zSpieler );
-	void updateSpielerStatus( Spieler *zSpieler );
-	void setTeamName( int team, char *name );
-	void setTeamStatus( int team, const char *txt, int f );
-	void setTeamPunkte( int teamId, int punkte );
-	void setTeamMaxPunkte( int teamId, int mPunkte );
-	void setSpielerPunkte( int teamNum, int sNum, int punkte );
-	void addPunkt( int tNum, bool plus );
-	void addPunkt( int tNum, int sNum, bool plus );
-	void updatePunkte();
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	int getTeamAnzahl() const;
-	bool teamExistiert( int team ) const;
-	int getTeamPunkte( int team ) const;
-	// Reference Counting
-	Bestenliste *getThis();
-	Bestenliste *release();
+    // Konstruktor
+    Bestenliste( UIInit &uiFactory );
+    // Destruktor
+    ~Bestenliste();
+    // nicht constant
+    void setTeamAnzahl( int anz );
+    void addSpieler( Spieler *zSpieler );
+    void updateSpielerStatus( Spieler *zSpieler );
+    void setTeamName( int team, char *name );
+    void setTeamStatus( int team, const char *txt, int f );
+    void setTeamPunkte( int teamId, int punkte );
+    void setTeamMaxPunkte( int teamId, int mPunkte );
+    void setSpielerPunkte( int teamNum, int sNum, int punkte );
+    void addPunkt( int tNum, bool plus );
+    void addPunkt( int tNum, int sNum, bool plus );
+    void updatePunkte();
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    int getTeamAnzahl() const;
+    bool teamExistiert( int team ) const;
+    int getTeamPunkte( int team ) const;
 };
 
 #endif

+ 4 - 30
Linie/Spiel/Chat/Chat.cpp

@@ -9,30 +9,27 @@
 
 // Inhalt der SpielChat Klasse aus Chat.h
 // Konstruktor
-SpielChat::SpielChat()
+SpielChat::SpielChat( UIInit &factory )
+    : ReferenceCounter()
 {
     rahmen = new LRahmen();
     rahmen->setFarbe( 0xFF909090 );
     rahmen->setRamenBreite( 1 );
     rahmen->setSize( 450, 200 );
     rahmen->setPosition( 10, BildschirmGröße().y - 210 );
-    verlauf = new TextFeld();
+    verlauf = factory.createTextFeld( factory.initParam );
     verlauf->setStyle( TextFeld::Style::TextGebiet & ~( TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen ) );
     verlauf->setText( "" );
-    verlauf->setSchriftFarbe( 0xFFFFFFFF );
-    verlauf->setSchriftSize( 12 );
     verlauf->setPosition( rahmen->getX() + 2, rahmen->getY() + 2 );
     verlauf->setSize( 446, 174 );
-    nachricht = new TextFeld();
+    nachricht = factory.createTextFeld( factory.initParam );
     nachricht->setStyle( TextFeld::Style::TextFeld & ~TextFeld::Style::Buffered );
     nachricht->setText( "" );
     nachricht->setSchriftFarbe( 0xFF909090 );
-    nachricht->setSchriftSize( 12 );
     nachricht->setRahmenBreite( 1 );
     nachricht->setRahmenFarbe( 0xFF909090 );
     nachricht->setPosition( rahmen->getX() + 2, rahmen->getY() + 178 );
     nachricht->setSize( 446, 20 );
-    ref = 1;
 }
 
 // Destruktor
@@ -44,12 +41,6 @@ SpielChat::~SpielChat()
 }
 
 // nicht constant
-void SpielChat::setSchrift( Schrift *zSchrift )
-{
-    verlauf->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
-    nachricht->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
-}
-
 void SpielChat::addNachricht( char *nachricht )
 {
     verlauf->addZeile( nachricht, 0xFFFFFFFF );
@@ -139,21 +130,4 @@ void SpielChat::render( Bild &zRObj )
     rahmen->render( zRObj );
     verlauf->render( zRObj );
     nachricht->render( zRObj );
-}
-
-// constant
-
-// Reference Counting
-SpielChat *SpielChat::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpielChat *SpielChat::relese()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 16 - 22
Linie/Spiel/Chat/Chat.h

@@ -4,35 +4,29 @@
 #include <KSGNetwork.h>
 #include <TextFeld.h>
 #include <Rahmen.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
-class SpielChat
+class SpielChat : public virtual ReferenceCounter
 {
 private:
-	LRahmen *rahmen = 0;
-	TextFeld *verlauf;
-	TextFeld *nachricht;
-	int ref;
+    LRahmen *rahmen = 0;
+    TextFeld *verlauf;
+    TextFeld *nachricht;
 
 public:
-	// Konstruktor
-	SpielChat();
-	// Destruktor
-	~SpielChat();
-	// nicht constant
-	void setSchrift( Schrift *zSchrift );
-	void addNachricht( char *nachricht );
-	void addNachricht( char *nachricht, int farbe );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te, KSGClient::SpielServerClient *zKlient );
-	void tick( double z );
-	void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	SpielChat *getThis();
-	SpielChat *relese();
+    // Konstruktor
+    SpielChat( UIInit &factory );
+    // Destruktor
+    ~SpielChat();
+    // nicht constant
+    void addNachricht( char *nachricht );
+    void addNachricht( char *nachricht, int farbe );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te, KSGClient::SpielServerClient *zKlient );
+    void tick( double z );
+    void render( Bild &zRObj );
 };
 
 #endif

+ 5 - 26
Linie/Spiel/Ende/Ende.cpp

@@ -7,31 +7,25 @@
 
 // Inhalt der Ende Klasse aus Ende.h
 // Konstruktor
-Ende::Ende( Schrift *zSchrift )
+Ende::Ende( UIInit &uiFactory )
+    : ReferenceCounter()
 {
     rahmen = new LRahmen();
     rahmen->setSize( 200, 100 );
     rahmen->setRamenBreite( 2 );
     rahmen->setFarbe( 0xFFFFFFFF );
-    text = new TextFeld();
+    text = uiFactory.createTextFeld( uiFactory.initParam );
     text->setStyle( TextFeld::Style::Text | TextFeld::Style::Center );
-    text->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
     text->setText( "" );
-    text->setSchriftFarbe( 0xFFFFFFFF );
     text->setSize( 200, 50 );
-    warten = new TextFeld();
+    warten = uiFactory.createTextFeld( uiFactory.initParam );
     warten->setStyle( ( TextFeld::Style::Text | TextFeld::Style::Center ) & ~TextFeld::Style::Sichtbar );
-    warten->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
     warten->setText( "Bitte warten..." );
-    warten->setSchriftFarbe( 0xFFFFFFFF );
     warten->setSize( 200, 50 );
-    ok = new Knopf();
-    ok->setStyle( Knopf::Style::Normal );
+    ok = uiFactory.createKnopf( uiFactory.initParam );
     ok->setSize( 100, 20 );
     ok->setText( "Weiter" );
-    ok->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
     weiter = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -93,19 +87,4 @@ void Ende::render( Bild &zRObj )
 bool Ende::getWeiter() const
 {
     return weiter;
-}
-
-// Reference Counting
-Ende *Ende::getThis()
-{
-    ref++;
-    return this;
-}
-
-Ende *Ende::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 17 - 20
Linie/Spiel/Ende/Ende.h

@@ -3,33 +3,30 @@
 
 #include <Knopf.h>
 #include <Rahmen.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
-class Ende
+class Ende : public virtual ReferenceCounter
 {
 private:
-	LRahmen *rahmen;
-	TextFeld *text;
-	TextFeld *warten;
-	Knopf *ok;
-	bool weiter;
-	int ref;
+    LRahmen *rahmen;
+    TextFeld *text;
+    TextFeld *warten;
+    Knopf *ok;
+    bool weiter;
 
 public:
-	// Konstruktor
-	Ende( Schrift *zSchrift );
-	// Destruktor
-	~Ende( );
-	// nicht constant
-	void setGewonnen( char gewonnen );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	bool getWeiter( ) const;
-	// Reference Counting
-	Ende *getThis( );
-	Ende *release( );
+    // Konstruktor
+    Ende( UIInit &uiFactory );
+    // Destruktor
+    ~Ende();
+    // nicht constant
+    void setGewonnen( char gewonnen );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    bool getWeiter() const;
 };
 
 #endif

+ 4 - 23
Linie/Spiel/Ende/RundenEnde.cpp

@@ -7,26 +7,22 @@
 
 // Inhalt der RundenEnde Klasse aus RundenEnde.h
 // Konstruktor
-RundenEnde::RundenEnde( Schrift *zSchrift )
+RundenEnde::RundenEnde( UIInit &uiFactory )
+    : ReferenceCounter()
 {
     rahmen = new LRahmen();
     rahmen->setSize( 220, 70 );
     rahmen->setRamenBreite( 2 );
     rahmen->setFarbe( 0xFFFFFFFF );
-    text = new TextFeld();
+    text = uiFactory.createTextFeld( uiFactory.initParam );
     text->setStyle( TextFeld::Style::Text | TextFeld::Style::Center );
-    text->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
     text->setText( "" );
-    text->setSchriftFarbe( 0xFFFFFFFF );
     text->setSize( 220, 50 );
-    warten = new TextFeld();
+    warten = uiFactory.createTextFeld( uiFactory.initParam );
     warten->setStyle( TextFeld::Style::Text | TextFeld::Style::Center );
-    warten->setSchriftZ( dynamic_cast<Schrift *>( zSchrift->getThis() ) );
     warten->setText( "Nächste Runde startet in: 5" );
-    warten->setSchriftFarbe( 0xFFFFFFFF );
     warten->setSize( 220, 45 );
     sichtbar = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -81,19 +77,4 @@ void RundenEnde::render( Bild &zRObj )
 bool RundenEnde::istSichtbar() const
 {
     return sichtbar;
-}
-
-// Reference Counting
-RundenEnde *RundenEnde::getThis()
-{
-    ref++;
-    return this;
-}
-
-RundenEnde *RundenEnde::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 17 - 20
Linie/Spiel/Ende/RundenEnde.h

@@ -3,33 +3,30 @@
 
 #include <TextFeld.h>
 #include <Rahmen.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
-class RundenEnde
+class RundenEnde : public virtual ReferenceCounter
 {
 private:
-	LRahmen *rahmen;
-	TextFeld *text;
-	TextFeld *warten;
-	bool sichtbar;
-	int ref;
+    LRahmen *rahmen;
+    TextFeld *text;
+    TextFeld *warten;
+    bool sichtbar;
 
 public:
-	// Konstruktor
-	RundenEnde( Schrift *zSchrift );
-	// Destruktor
-	~RundenEnde();
-	// nicht constant
-	void setSichtbar( bool b );
-	void setGewonnen( bool gewonnen );
-	void setZeit( int sekunden );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-	// Reference Counting
-	RundenEnde *getThis();
-	RundenEnde *release();
+    // Konstruktor
+    RundenEnde( UIInit &uiFactory );
+    // Destruktor
+    ~RundenEnde();
+    // nicht constant
+    void setSichtbar( bool b );
+    void setGewonnen( bool gewonnen );
+    void setZeit( int sekunden );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
 };
 
 #endif

+ 36 - 51
Linie/Spiel/Kamera/Kamera.cpp

@@ -6,119 +6,104 @@
 // Inhalt der Kamera Klasse aus Kamera.h
 // Konstruktor
 Kamera::Kamera()
+    : ReferenceCounter()
 {
-	pos = Punkt( 0, 0 );
-	gr = Punkt( 0, 0 );
-	rGr =  Punkt( 0, 0 );
-	rahmen = new LRahmen();
-	rahmen->setFarbe( 0xFF505050 );
-	rahmen->setRamenBreite( 1 );
-	ref = 1;
+    pos = Punkt( 0, 0 );
+    gr = Punkt( 0, 0 );
+    rGr = Punkt( 0, 0 );
+    rahmen = new LRahmen();
+    rahmen->setFarbe( 0xFF505050 );
+    rahmen->setRamenBreite( 1 );
 }
 
 // Destruktor
 Kamera::~Kamera()
 {
-	rahmen->release();
+    rahmen->release();
 }
 
 // nicht constant
 void Kamera::setPosition( int x, int y )
 {
-	pos.x = x;
-	pos.y = y;
+    pos.x = x;
+    pos.y = y;
 }
 
 void Kamera::addPosition( int x, int y, Karte *zMap )
 {
-	pos.x += x;
-	pos.y += y;
-	if( pos.x < 0 )
-		pos.x = 0;
-	if( pos.y < 0 )
-		pos.y = 0;
-	if( pos.x > zMap->getBreite() )
-		pos.x = zMap->getBreite();
-	if( pos.y > zMap->getHeight() )
-		pos.y = zMap->getHeight();
+    pos.x += x;
+    pos.y += y;
+    if( pos.x < 0 )
+        pos.x = 0;
+    if( pos.y < 0 )
+        pos.y = 0;
+    if( pos.x > zMap->getBreite() )
+        pos.x = zMap->getBreite();
+    if( pos.y > zMap->getHeight() )
+        pos.y = zMap->getHeight();
 }
 
 void Kamera::setSize( int br, int hö )
 {
-	gr.x = br;
-	gr.y = hö;
+    gr.x = br;
+    gr.y = hö;
 }
 
 void Kamera::render( Bild &zRObj )
 {
-	rGr = zRObj.getSize();
-	rahmen->setPosition( getRX( getLinks() ), getRY( getOben() ) );
-	rahmen->setSize( gr );
-	rahmen->render( zRObj );
+    rGr = zRObj.getSize();
+    rahmen->setPosition( getRX( getLinks() ), getRY( getOben() ) );
+    rahmen->setSize( gr );
+    rahmen->render( zRObj );
 }
 
 // constant
 int Kamera::getLinks() const
 {
-	return pos.x - (int)( gr.x / 2.0 + 0.5 );
+    return pos.x - (int)( gr.x / 2.0 + 0.5 );
 }
 
 int Kamera::getOben() const
 {
-	return pos.y - gr.y / 2;
+    return pos.y - gr.y / 2;
 }
 
 int Kamera::getRechts() const
 {
-	return pos.x + gr.x / 2;
+    return pos.x + gr.x / 2;
 }
 
 int Kamera::getUnten() const
 {
-	return pos.y + gr.y / 2;
+    return pos.y + gr.y / 2;
 }
 
 bool Kamera::istSichtbar( int x, int y ) const
 {
-	return ( x >= getLinks() && x < getRechts() && y >= getOben() && y < getUnten() );
+    return ( x >= getLinks() && x < getRechts() && y >= getOben() && y < getUnten() );
 }
 
 bool Kamera::istMausIn( int x, int y ) const
 {
-	return ( x >= ( rGr.x / 2 - gr.x / 2 ) && x < ( rGr.x / 2 + gr.x / 2 ) && y >= ( rGr.y / 2 - gr.y / 2 ) && y < ( rGr.y / 2 + gr.y / 2 ) );
+    return ( x >= ( rGr.x / 2 - gr.x / 2 ) && x < ( rGr.x / 2 + gr.x / 2 ) && y >= ( rGr.y / 2 - gr.y / 2 ) && y < ( rGr.y / 2 + gr.y / 2 ) );
 }
 
 int Kamera::getRX( int mapX ) const
 {
-	return rGr.x / 2 - ( pos.x - mapX );
+    return rGr.x / 2 - ( pos.x - mapX );
 }
 
 int Kamera::getRY( int mapY ) const
 {
-	return rGr.y / 2 - ( pos.y - mapY );
+    return rGr.y / 2 - ( pos.y - mapY );
 }
 
 int Kamera::getX() const
 {
-	return pos.x;
+    return pos.x;
 }
 
 int Kamera::getY() const
 {
-	return pos.y;
-}
-
-// Reference Counting
-Kamera *Kamera::getThis()
-{
-	ref++;
-	return this;
-}
-
-Kamera *Kamera::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return pos.y;
 }

+ 25 - 29
Linie/Spiel/Kamera/Kamera.h

@@ -8,39 +8,35 @@ using namespace Framework;
 
 class Karte;
 
-class Kamera
+class Kamera : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	Punkt rGr;
-	LRahmen *rahmen;
-	int ref;
+    Punkt pos;
+    Punkt gr;
+    Punkt rGr;
+    LRahmen *rahmen;
 
 public:
-	// Konstruktor
-	Kamera();
-	// Destruktor
-	~Kamera();
-	// nicht constant
-	void setPosition( int x, int y );
-	void addPosition( int x, int y, Karte *zMap );
-	void setSize( int br, int hö );
-	void render( Bild &zRObj );
-	// constant
-	int getLinks() const;
-	int getOben() const;
-	int getRechts() const;
-	int getUnten() const;
-	bool istSichtbar( int x, int y ) const;
-	bool istMausIn( int x, int y ) const;
-	int getRX( int mapX ) const;
-	int getRY( int mapY ) const;
-	int getX() const;
-	int getY() const;
-	// Reference Counting
-	Kamera *release();
-	Kamera *getThis();
+    // Konstruktor
+    Kamera();
+    // Destruktor
+    ~Kamera();
+    // nicht constant
+    void setPosition( int x, int y );
+    void addPosition( int x, int y, Karte *zMap );
+    void setSize( int br, int hö );
+    void render( Bild &zRObj );
+    // constant
+    int getLinks() const;
+    int getOben() const;
+    int getRechts() const;
+    int getUnten() const;
+    bool istSichtbar( int x, int y ) const;
+    bool istMausIn( int x, int y ) const;
+    int getRX( int mapX ) const;
+    int getRY( int mapY ) const;
+    int getX() const;
+    int getY() const;
 };
 
 #endif

+ 18 - 33
Linie/Spiel/Karte/Karte.cpp

@@ -6,73 +6,58 @@
 // Inhalt der Karte Klasse aus Karte.h
 // Konstruktor
 Karte::Karte()
+    : ReferenceCounter()
 {
-	karteId = 0;
-	map = new Bild();
-	rahmen = new LRahmen();
-	rahmen->setFarbe( 0xFFFFFFFF );
-	rahmen->setRamenBreite( 2 );
-	ref = 1;
+    karteId = 0;
+    map = new Bild();
+    rahmen = new LRahmen();
+    rahmen->setFarbe( 0xFFFFFFFF );
+    rahmen->setRamenBreite( 2 );
 }
 
 // Destruktor
 Karte::~Karte()
 {
-	map->release();
-	rahmen->release();
+    map->release();
+    rahmen->release();
 }
 
 // nicht constant
 void Karte::setSize( int br, int hö )
 {
-	map->neuBild( br, hö, 0xFF000000 );
-	rahmen->setSize( br, hö );
+    map->neuBild( br, hö, 0xFF000000 );
+    rahmen->setSize( br, hö );
 }
 
 void Karte::setId( int id )
 {
-	karteId = id;
+    karteId = id;
 }
 
 void Karte::render( Kamera *zKam, Bild &zRObj )
 {
-	rahmen->setPosition( zKam->getRX( 0 ), zKam->getRY( 0 ) );
-	zRObj.drawBild( rahmen->getX(), rahmen->getY(), map->getBreite(), map->getHeight(), *map );
-	rahmen->render( zRObj );
+    rahmen->setPosition( zKam->getRX( 0 ), zKam->getRY( 0 ) );
+    zRObj.drawBild( rahmen->getX(), rahmen->getY(), map->getBreite(), map->getHeight(), *map );
+    rahmen->render( zRObj );
 }
 
 // constant
 int Karte::getId() const
 {
-	return karteId;
+    return karteId;
 }
 
 int Karte::getBreite() const
 {
-	return map->getBreite();
+    return map->getBreite();
 }
 
 int Karte::getHeight() const
 {
-	return map->getHeight();
+    return map->getHeight();
 }
 
 Bild *Karte::zMap() const
 {
-	return ( map->getBreite() != 0 && map->getHeight() != 0 ) ? map : 0;
-}
-
-// Reference Counting
-Karte *Karte::getThis()
-{
-	ref++;
-	return this;
-}
-
-Karte *Karte::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return ( map->getBreite() != 0 && map->getHeight() != 0 ) ? map : 0;
 }

+ 17 - 21
Linie/Spiel/Karte/Karte.h

@@ -8,31 +8,27 @@ using namespace Framework;
 
 class Kamera;
 
-class Karte
+class Karte : public virtual ReferenceCounter
 {
 private:
-	int karteId;
-	Bild *map;
-	LRahmen *rahmen;
-	int ref;
+    int karteId;
+    Bild *map;
+    LRahmen *rahmen;
 
 public:
-	// Konstruktor
-	Karte();
-	// Destruktor
-	~Karte();
-	// nicht constant
-	void setSize( int br, int hö );
-	void setId( int id );
-	void render( Kamera *zKam, Bild &zRObj );
-	// constant
-	int getId() const;
-	int getBreite() const;
-	int getHeight() const;
-	Bild *zMap() const;
-	// Reference Counting
-	Karte *getThis();
-	Karte *release();
+    // Konstruktor
+    Karte();
+    // Destruktor
+    ~Karte();
+    // nicht constant
+    void setSize( int br, int hö );
+    void setId( int id );
+    void render( Kamera *zKam, Bild &zRObj );
+    // constant
+    int getId() const;
+    int getBreite() const;
+    int getHeight() const;
+    Bild *zMap() const;
 };
 
 #endif

+ 25 - 49
Linie/Spiel/SpielKlasse.cpp

@@ -7,21 +7,21 @@
 // Inhalt der SpielKlasse Klasse aus SpielKlasse.h
 // Konstruktor
 SpielKlasse::SpielKlasse()
+    : ReferenceCounter()
 {
+    uiFactory.initParam.bildschirm = 0;
     spielZeit = 0;
     rZeit = 0;
     spielPause = 1;
     rendern = 0;
     stkn = new RCArray< STKNachricht >();
     stkna = 0;
-    schrift = 0;
     time_t t;
     time( &t );
     srand( (unsigned int)t );
     infoKlient = 0;
     spielKlient = 0;
     spieler = new RCArray< Spieler >();
-    screen = 0;
     kam = 0;
     spielerAnzahl = 0;
     karteId = 0;
@@ -29,22 +29,19 @@ SpielKlasse::SpielKlasse()
     map = 0;
     rEnd = 0;
     end = 0;
-    chat = new SpielChat();
+    chat = 0;
     tasten = new char[ 256 ];
     for( int i = 0; i < 256; i++ )
         tasten[ i ] = 0;
     mx = -1;
     my = -1;
     bestenliste = 0;
-    ref = 1;
 }
 
 // Destruktor
 SpielKlasse::~SpielKlasse()
 {
     stkn->release();
-    if( schrift )
-        schrift->release();
     if( infoKlient )
         infoKlient->release();
     if( spielKlient )
@@ -59,7 +56,8 @@ SpielKlasse::~SpielKlasse()
         end->release();
     if( bestenliste )
         bestenliste->release();
-    chat->relese();
+    if( chat )
+        chat->release();
     spieler->release();
     delete[] tasten;
 }
@@ -78,31 +76,20 @@ bool SpielKlasse::istAmLeben() const
 // nicht constant
 void SpielKlasse::lock()
 {
-    if( screen )
-        screen->lock();
+    if( uiFactory.initParam.bildschirm )
+        uiFactory.initParam.bildschirm->lock();
 }
 
 void SpielKlasse::unlock()
 {
-    if( screen )
-        screen->unlock();
+    if( uiFactory.initParam.bildschirm )
+        uiFactory.initParam.bildschirm->unlock();
 }
 
-void SpielKlasse::setSchrift( Schrift *schrift )
+void SpielKlasse::setUIFactory( UIInit &factory )
 {
-    if( this->schrift )
-        this->schrift->release();
-    this->schrift = schrift;
-    chat->setSchrift( schrift );
-    if( !bestenliste )
-        bestenliste = new Bestenliste( dynamic_cast<Schrift *>( schrift->getThis() ) );
-    if( !rEnd )
-        rEnd = new RundenEnde( schrift );
-}
-
-void SpielKlasse::setBildschirm( Bildschirm *zScreen )
-{
-    screen = zScreen;
+    chat = new SpielChat( uiFactory );
+    uiFactory = factory;
 }
 
 void SpielKlasse::nachricht( int län, char *bytes )
@@ -175,7 +162,8 @@ void SpielKlasse::doPublicMausEreignis( MausEreignis &me )
         mx = -1;
         my = -1;
     }
-    chat->doPublicMausEreignis( me );
+    if( chat )
+        chat->doPublicMausEreignis( me );
     if( bestenliste )
         bestenliste->doPublicMausEreignis( me );
 }
@@ -260,7 +248,7 @@ void SpielKlasse::doTastaturEreignis( TastaturEreignis &te )
             }
         }
     }
-    if( !te.verarbeitet )
+    if( !te.verarbeitet && chat )
         chat->doTastaturEreignis( te, spielKlient );
 }
 
@@ -411,9 +399,9 @@ void SpielKlasse::stknVerarbeitung()
                             bestenliste->addPunkt( team, player, 1 );
                     }
                 }
-                if( sNum == spielerNummer )
+                if( sNum == spielerNummer && chat )
                     chat->addNachricht( "Du bist gestorben.", 0xFFFFFF00 );
-                else if( zName )
+                else if( zName && chat )
                 {
                     Text *txt = new Text( zName->getText() );
                     txt->append( " ist gestorben." );
@@ -429,7 +417,7 @@ void SpielKlasse::stknVerarbeitung()
                 bytes++;
                 char gewonnen = *bytes;
                 län--;
-                end = new Ende( schrift );
+                end = new Ende( uiFactory );
                 end->setGewonnen( gewonnen );
             }
             break;
@@ -551,7 +539,8 @@ void SpielKlasse::stknVerarbeitung()
                 bytes++;
                 Text *txt = new Text( "" );
                 txt->append( bytes, län );
-                chat->addNachricht( txt->getText() );
+                if( chat )
+                    chat->addNachricht( txt->getText() );
                 txt->release();
                 län = 0;
             }
@@ -703,7 +692,7 @@ void SpielKlasse::stknVerarbeitung()
             // Fehler beim verarbeiten
             break;
         }
-        if( län != 0 )
+        if( län != 0 && chat )
         {
             // Fehler beim verarbeiten
             chat->addNachricht( "Es ist ein Fehler beim verarbeiten einer Nachricht aufgetreten.", 0xFFFF0000 );
@@ -758,7 +747,8 @@ bool SpielKlasse::tick( double zeit )
                 kam->addPosition( (int)px, (int)py, map );
             }
         }
-        chat->tick( !zeit ? 0.05 : zeit );
+        if( chat )
+            chat->tick( !zeit ? 0.05 : zeit );
     }
     return 1;
 }
@@ -768,7 +758,8 @@ void SpielKlasse::render( Bild &zRObj )
     if( !rendern )
         return;
     lock();
-    chat->render( zRObj );
+    if( chat )
+        chat->render( zRObj );
     if( bestenliste )
         bestenliste->render( zRObj );
     kam->render( zRObj );
@@ -800,19 +791,4 @@ int SpielKlasse::l
     if( end && end->getWeiter() )
         return 0;
     return 0;
-}
-
-// Reference Counting
-SpielV *SpielKlasse::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpielV *SpielKlasse::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 42 - 48
Linie/Spiel/SpielKlasse.h

@@ -14,56 +14,50 @@
 class SpielKlasse : public SpielV
 {
 private:
-	RCArray< STKNachricht > *stkn;
-	int stkna;
-	Bestenliste *bestenliste;
-	Schrift *schrift;
-	KSGClient::InformationServerClient *infoKlient;
-	KSGClient::SpielServerClient *spielKlient;
-	RCArray< Spieler > *spieler;
-	Bildschirm *screen;
-	Karte *map;
-	Kamera *kam;
-	SpielChat *chat;
-	RundenEnde *rEnd;
-	Ende *end;
-	bool rendern;
-	double spielZeit;
-	double rZeit;
-	bool spielPause;
-	int spielerAnzahl;
-	int karteId;
-	int spielerNummer;
-	char *tasten;
-	int mx;
-	int my;
-	int ref;
-	bool istAmLeben() const;
+    UIInit uiFactory;
+    RCArray< STKNachricht > *stkn;
+    int stkna;
+    Bestenliste *bestenliste;
+    KSGClient::InformationServerClient *infoKlient;
+    KSGClient::SpielServerClient *spielKlient;
+    RCArray< Spieler > *spieler;
+    Karte *map;
+    Kamera *kam;
+    SpielChat *chat;
+    RundenEnde *rEnd;
+    Ende *end;
+    bool rendern;
+    double spielZeit;
+    double rZeit;
+    bool spielPause;
+    int spielerAnzahl;
+    int karteId;
+    int spielerNummer;
+    char *tasten;
+    int mx;
+    int my;
+    bool istAmLeben() const;
 
 public:
-	// Konstruktor
-	SpielKlasse();
-	// Destruktor
-	~SpielKlasse();
-	// nicht constant
-	void lock();
-	void unlock();
-	void setSchrift( Schrift *schrift ) override; // call 4
-	void setBildschirm( Bildschirm *zScreen ) override; // call 3
-	void nachricht( int län, char *bytes ) override;
-	void setKlients( KSGClient::InformationServerClient *infoKlient, KSGClient::SpielServerClient *spielKlient ) override; // call 2
-	void setKarteId( int karteId ) override; // call 1
-	void ladeDaten() override; // call 5
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	void stknVerarbeitung();
-	bool tick( double zeit ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	int läuft() const override;
-	// Reference Counting
-	SpielV *getThis() override;
-	SpielV *release() override;
+    // Konstruktor
+    SpielKlasse();
+    // Destruktor
+    ~SpielKlasse();
+    // nicht constant
+    void lock();
+    void unlock();
+    void setUIFactory( UIInit &factory ) override;
+    void nachricht( int län, char *bytes ) override;
+    void setKlients( KSGClient::InformationServerClient *infoKlient, KSGClient::SpielServerClient *spielKlient ) override; // call 2
+    void setKarteId( int karteId ) override; // call 1
+    void ladeDaten() override; // call 5
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    void stknVerarbeitung();
+    bool tick( double zeit ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    int läuft() const override;
 };
 
 #endif

+ 1 - 16
Linie/Spiel/Spieler/Spieler.cpp

@@ -6,6 +6,7 @@
 // Inhalt der Spieler Klasse aus Spieler.h
 // Konstruktor
 Spieler::Spieler( KSGClient::InformationServerClient *zInfoK )
+    : ReferenceCounter()
 {
     xPos = 0;
     yPos = 0;
@@ -26,7 +27,6 @@ Spieler::Spieler( KSGClient::InformationServerClient *zInfoK )
     accId = 0;
     amLeben = 1;
     linieUnterbrochen = 1;
-    ref = 1;
 }
 
 // Destruktor
@@ -362,19 +362,4 @@ Text *Spieler::getName() const
 Text *Spieler::zName() const
 {
     return name;
-}
-
-// Reference Counting
-Spieler *Spieler::getThis()
-{
-    ref++;
-    return this;
-}
-
-Spieler *Spieler::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 53 - 57
Linie/Spiel/Spieler/Spieler.h

@@ -5,67 +5,63 @@
 #include <KSGNetwork.h>
 #include "..\Kamera\Kamera.h"
 
-class Spieler
+class Spieler : public virtual ReferenceCounter
 {
 private:
-	double xPos;
-	double yPos;
-	double xSpeed;
-	double ySpeed;
-	double kurve;
-	bool lKurve;
-	bool rKurve;
-	int spielerNummer;
-	int team;
-	int radius;
-	bool amLeben;
-	bool linieUnterbrochen;
-	int accId;
-	KSGClient::InformationServerClient *info;
-	Text *name;
-	LRahmen *teamRahmen;
-	int spielerFarbe;
-	int teamFarbe;
-	int ref;
+    double xPos;
+    double yPos;
+    double xSpeed;
+    double ySpeed;
+    double kurve;
+    bool lKurve;
+    bool rKurve;
+    int spielerNummer;
+    int team;
+    int radius;
+    bool amLeben;
+    bool linieUnterbrochen;
+    int accId;
+    KSGClient::InformationServerClient *info;
+    Text *name;
+    LRahmen *teamRahmen;
+    int spielerFarbe;
+    int teamFarbe;
 
 public:
-	// Konstruktor
-	Spieler( KSGClient::InformationServerClient *zInfoK );
-	// Destruktor
-	~Spieler();
-	// nicht constant
-	void neuRunde();
-	void setAccountId( int accId );
-	void setSpielerNummer( int num );
-	void setTeam( int team );
-	void setTeamFarbe( int fc );
-	void setSpielerFarbe( int fc );
-	void setPos( double x, double y );
-	void setRadius( int r );
-	void setSpeed( double xSpeed, double ySpeed );
-	void setKurveSpeed( double kurve );
-	void setLinksKurve( Bild *zMap, bool lKurve, double sendeZeit, double spielZeit );
-	void setRechtsKurve( Bild *zMap, bool rKurve, double sendeZeit, double spielzeit );
-	void sterben( Bild *zMap, double sendeZeit, double spielZeit );
-	void sterben();
-	void setLinienUnterbrechung( Bild *zMap, bool unterbrechung, double sendeZeit, double spielZeit );
-	void prozessKurve( double zeit );
-	void tick( Bild *zMap, double zeit );
-	void render( Kamera *zKam, Bild &zRObj );
-	// constant
-	double getX() const;
-	double getY() const;
-	int getTeam() const;
-	int getTeamFarbe() const;
-	int getFarbe() const;
-	int getSpielerNummer() const;
-	bool istAmLeben() const;
-	int getAccountId() const;
-	Text *getName() const;
-	Text *zName() const;
-	// Reference Counting
-	Spieler *getThis();
-	Spieler *release();
+    // Konstruktor
+    Spieler( KSGClient::InformationServerClient *zInfoK );
+    // Destruktor
+    ~Spieler();
+    // nicht constant
+    void neuRunde();
+    void setAccountId( int accId );
+    void setSpielerNummer( int num );
+    void setTeam( int team );
+    void setTeamFarbe( int fc );
+    void setSpielerFarbe( int fc );
+    void setPos( double x, double y );
+    void setRadius( int r );
+    void setSpeed( double xSpeed, double ySpeed );
+    void setKurveSpeed( double kurve );
+    void setLinksKurve( Bild *zMap, bool lKurve, double sendeZeit, double spielZeit );
+    void setRechtsKurve( Bild *zMap, bool rKurve, double sendeZeit, double spielzeit );
+    void sterben( Bild *zMap, double sendeZeit, double spielZeit );
+    void sterben();
+    void setLinienUnterbrechung( Bild *zMap, bool unterbrechung, double sendeZeit, double spielZeit );
+    void prozessKurve( double zeit );
+    void tick( Bild *zMap, double zeit );
+    void render( Kamera *zKam, Bild &zRObj );
+    // constant
+    double getX() const;
+    double getY() const;
+    int getTeam() const;
+    int getTeamFarbe() const;
+    int getFarbe() const;
+    int getSpielerNummer() const;
+    bool istAmLeben() const;
+    int getAccountId() const;
+    Text *getName() const;
+    Text *zName() const;
 };
 
 #endif

+ 341 - 362
Linie/SpielStatistik/Chat/StatistikChat.cpp

@@ -6,477 +6,456 @@
 #include <Scroll.h>
 #include <Rahmen.h>
 #include <TastaturEreignis.h>
-#include "../../Initialisierung/Initialisierung.h"
+#include <Schrift.h>
 
 // Inhalt der ChatListeSpieler Klasse aus StatistikChat.h
 // Konstruktor
-ChatListeSpieler::ChatListeSpieler( int accountId, int eigeneId, Schrift *zSchrift, BilderV *bilder, KSGClient::InformationServerClient *zInfoc,
-									bool istFreund, void( *addChatF )( void*, int ), void( *addFreundF )( void*, int ),
-									void( *accountAnsehenF )( void *, int ), void *param )
-: addChatF( addChatF ),
-  addFreundF( addFreundF ),
-  accountAnsehenF( accountAnsehenF ),
-  nachrichtParam( param ),
-  accountId( accountId ),
-  bg( new AlphaFeld() ),
-  name( initTextFeld( 0, 0, 133, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Rahmen | TextFeld::Style::VCenter, "" ) ),
-  accountAnsehen( initKnopf( 133, 0, 20, 20, 0, 0, "" ) ),
-  nachrichtSenden( initKnopf( 153, 0, 20, 20, 0, 0, "" ) ),
-  freundesanfrageSenden( initKnopf( 173, 0, 20, 20, 0, 0, "" ) ),
-  pos( 0, 0 ),
-  gr( 133, 20 ),
-  online( 1 ),
-  minKnopfX( 113 - ( ( ( accountId != eigeneId ) + !istFreund ) * 20 ) ),
-  knopfX( 133 ),
-  mausIn( 0 ),
-  tickVal( 0 ),
-  rend( 0 ),
-  ref( 1 )
+ChatListeSpieler::ChatListeSpieler( int accountId, int eigeneId, UIInit &uiFactory, BilderV *bilder, KSGClient::InformationServerClient *zInfoc,
+                                    bool istFreund, void( *addChatF )( void *, int ), void( *addFreundF )( void *, int ),
+                                    void( *accountAnsehenF )( void *, int ), void *param )
+    : ReferenceCounter(),
+    addChatF( addChatF ),
+    addFreundF( addFreundF ),
+    accountAnsehenF( accountAnsehenF ),
+    nachrichtParam( param ),
+    accountId( accountId ),
+    bg( new AlphaFeld() ),
+    name( uiFactory.createTextFeld( uiFactory.initParam ) ),
+    accountAnsehen( uiFactory.createKnopf( uiFactory.initParam ) ),
+    nachrichtSenden( uiFactory.createKnopf( uiFactory.initParam ) ),
+    freundesanfrageSenden( uiFactory.createKnopf( uiFactory.initParam ) ),
+    pos( 0, 0 ),
+    gr( 133, 20 ),
+    online( 1 ),
+    minKnopfX( 113 - ( ( ( accountId != eigeneId ) + !istFreund ) * 20 ) ),
+    knopfX( 133 ),
+    mausIn( 0 ),
+    tickVal( 0 ),
+    rend( 0 )
 {
-	Bild *ansehenBild = bilder->get( "data/client/bilder/chat.ltdb/ansehen.png" );
-	Bild *nachrichtBild = bilder->get( "data/client/bilder/chat.ltdb/nachricht.png" );
-	Bild *einladungBild = bilder->get( "data/client/bilder/chat.ltdb/neuerfreund.png" );
-	bg->setSize( gr );
-	bg->setFarbe( 0x0000FF00 );
-	bg->setStrength( -4 );
-	name->setText( zInfoc->getSpielerName( accountId ) );
-	accountAnsehen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	accountAnsehen->setHintergrundBildZ( ansehenBild );
-	nachrichtSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	nachrichtSenden->setHintergrundBildZ( nachrichtBild );
-	freundesanfrageSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	freundesanfrageSenden->setHintergrundBildZ( einladungBild );
+    name->setPosition( 0, 0 );
+    name->setSize( 133, 20 );
+    name->setStyle( TextFeld::Style::Text | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
+    name->setText( "" );
+    accountAnsehen->setPosition( 133, 0 );
+    accountAnsehen->setSize( 20, 20 );
+    accountAnsehen->setText( "" );
+    nachrichtSenden->setPosition( 153, 0 );
+    nachrichtSenden->setSize( 20, 20 );
+    nachrichtSenden->setText( "" );
+    freundesanfrageSenden->setPosition( 173, 0 );
+    freundesanfrageSenden->setSize( 20, 20 );
+    freundesanfrageSenden->setText( "" );
+    Bild *ansehenBild = bilder->get( "data/client/bilder/chat.ltdb/ansehen.png" );
+    Bild *nachrichtBild = bilder->get( "data/client/bilder/chat.ltdb/nachricht.png" );
+    Bild *einladungBild = bilder->get( "data/client/bilder/chat.ltdb/neuerfreund.png" );
+    bg->setSize( gr );
+    bg->setFarbe( 0x0000FF00 );
+    bg->setStrength( -4 );
+    name->setText( zInfoc->getSpielerName( accountId ) );
+    accountAnsehen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    accountAnsehen->setHintergrundBildZ( ansehenBild );
+    nachrichtSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    nachrichtSenden->setHintergrundBildZ( nachrichtBild );
+    freundesanfrageSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    freundesanfrageSenden->setHintergrundBildZ( einladungBild );
 }
 
 // Destruktor
 ChatListeSpieler::~ChatListeSpieler()
 {
-	bg->release();
-	name->release();
-	accountAnsehen->release();
-	nachrichtSenden->release();
-	freundesanfrageSenden->release();
+    bg->release();
+    name->release();
+    accountAnsehen->release();
+    nachrichtSenden->release();
+    freundesanfrageSenden->release();
 }
 
 // nicht constant
 void ChatListeSpieler::setOffline()
 {
-	online = 0;
+    online = 0;
 }
 
 void ChatListeSpieler::setPosition( int y )
 {
-	if( pos.y != y )
-		rend = 1;
-	pos.y = y;
+    if( pos.y != y )
+        rend = 1;
+    pos.y = y;
 }
 
 void ChatListeSpieler::doPublicMausEreignis( MausEreignis &me )
 {
-	int mx = me.mx;
-	int my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	if( me.mx > 0 && me.mx < gr.x && me.my > 0 && me.my < gr.y )
-		mausIn = 1;
-	else
-		mausIn = 0;
-	me.mx += 133 - knopfX;
-	bool vera = me.verarbeitet;
-	accountAnsehen->doPublicMausEreignis( me );
-	int aktion = ( me.verarbeitet && !vera ) ? 1 : 0;
-	nachrichtSenden->doPublicMausEreignis( me );
-	aktion = ( me.verarbeitet && !vera && !aktion ) ? 2 : aktion;
-	freundesanfrageSenden->doPublicMausEreignis( me );
-	aktion = ( me.verarbeitet && !vera && !aktion ) ? 3 : aktion;
-	me.mx -= 133 - knopfX;
-	if( me.id == ME_RLinks && mausIn )
-	{
-		switch( aktion )
-		{
-		case 1:
-			accountAnsehenF( nachrichtParam, accountId );
-			break;
-		case 2:
-			addChatF( nachrichtParam, accountId );
-			break;
-		case 3:
-			addFreundF( nachrichtParam, accountId );
-			break;
-		}
-	}
-	me.mx = mx;
-	me.my = my;
+    int mx = me.mx;
+    int my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    if( me.mx > 0 && me.mx < gr.x && me.my > 0 && me.my < gr.y )
+        mausIn = 1;
+    else
+        mausIn = 0;
+    me.mx += 133 - knopfX;
+    bool vera = me.verarbeitet;
+    accountAnsehen->doPublicMausEreignis( me );
+    int aktion = ( me.verarbeitet && !vera ) ? 1 : 0;
+    nachrichtSenden->doPublicMausEreignis( me );
+    aktion = ( me.verarbeitet && !vera && !aktion ) ? 2 : aktion;
+    freundesanfrageSenden->doPublicMausEreignis( me );
+    aktion = ( me.verarbeitet && !vera && !aktion ) ? 3 : aktion;
+    me.mx -= 133 - knopfX;
+    if( me.id == ME_RLinks && mausIn )
+    {
+        switch( aktion )
+        {
+        case 1:
+            accountAnsehenF( nachrichtParam, accountId );
+            break;
+        case 2:
+            addChatF( nachrichtParam, accountId );
+            break;
+        case 3:
+            addFreundF( nachrichtParam, accountId );
+            break;
+        }
+    }
+    me.mx = mx;
+    me.my = my;
 }
 
 bool ChatListeSpieler::tick( double tickVal )
 {
-	rend |= name->tick( tickVal );
-	rend |= accountAnsehen->tick( tickVal );
-	rend |= nachrichtSenden->tick( tickVal );
-	rend |= freundesanfrageSenden->tick( tickVal );
-	this->tickVal += tickVal * 60;
-	int val = ( int )this->tickVal;
-	if( val )
-	{
-		this->tickVal -= val;
-		if( mausIn && knopfX != minKnopfX )
-		{
-			if( knopfX - val < minKnopfX )
-				knopfX = minKnopfX;
-			else
-				knopfX -= val;
-			rend = 1;
-		}
-		if( !mausIn && knopfX != gr.x )
-		{
-			if( knopfX + val > gr.x )
-				knopfX = gr.x;
-			else
-				knopfX += val;
-			rend = 1;
-		}
-		if( !online && bg->getFarbe() != 0x00FF0000 )
-		{
-			int g = ( bg->getFarbe() >> 8 ) & 0xFF;
-			if( g - val < 0 )
-				bg->setFarbe( 0x00FF0000 );
-			else
-			{
-				bg->setFarbe( ( ( ( g - val ) << 8 ) & 0xFF00 ) | ( bg->getFarbe() & 0xFFFF00FF ) );
-				bg->setFarbe( ( ( ( 255 - (g - val) ) << 16 ) & 0xFF0000 ) | ( bg->getFarbe() & 0xFF00FFFF ) );
-			}
-			rend = 1;
-		}
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= name->tick( tickVal );
+    rend |= accountAnsehen->tick( tickVal );
+    rend |= nachrichtSenden->tick( tickVal );
+    rend |= freundesanfrageSenden->tick( tickVal );
+    this->tickVal += tickVal * 60;
+    int val = (int)this->tickVal;
+    if( val )
+    {
+        this->tickVal -= val;
+        if( mausIn && knopfX != minKnopfX )
+        {
+            if( knopfX - val < minKnopfX )
+                knopfX = minKnopfX;
+            else
+                knopfX -= val;
+            rend = 1;
+        }
+        if( !mausIn && knopfX != gr.x )
+        {
+            if( knopfX + val > gr.x )
+                knopfX = gr.x;
+            else
+                knopfX += val;
+            rend = 1;
+        }
+        if( !online && bg->getFarbe() != 0x00FF0000 )
+        {
+            int g = ( bg->getFarbe() >> 8 ) & 0xFF;
+            if( g - val < 0 )
+                bg->setFarbe( 0x00FF0000 );
+            else
+            {
+                bg->setFarbe( ( ( ( g - val ) << 8 ) & 0xFF00 ) | ( bg->getFarbe() & 0xFFFF00FF ) );
+                bg->setFarbe( ( ( ( 255 - ( g - val ) ) << 16 ) & 0xFF0000 ) | ( bg->getFarbe() & 0xFF00FFFF ) );
+            }
+            rend = 1;
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void ChatListeSpieler::render( Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( pos, gr ) )
-		return;
-	bg->render( zRObj );
-	name->render( zRObj );
-	zRObj.addScrollOffset( 133 - knopfX, 0 );
-	accountAnsehen->render( zRObj );
-	nachrichtSenden->render( zRObj );
-	freundesanfrageSenden->render( zRObj );
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( pos, gr ) )
+        return;
+    bg->render( zRObj );
+    name->render( zRObj );
+    zRObj.addScrollOffset( 133 - knopfX, 0 );
+    accountAnsehen->render( zRObj );
+    nachrichtSenden->render( zRObj );
+    freundesanfrageSenden->render( zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int ChatListeSpieler::getAccountId() const
 {
-	return accountId;
-}
-
-// Reference Counting
-ChatListeSpieler *ChatListeSpieler::getThis()
-{
-	ref++;
-	return this;
-}
-
-ChatListeSpieler *ChatListeSpieler::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return accountId;
 }
 
 
 // Inhalt der ChatListe Klasse aus StatistikChat.h
 // Konstruktor
-ChatListe::ChatListe( int eigeneId, KSGClient::InformationServerClient *infoc, Schrift *schrift, BilderV *bilder,
-					  void( *addChat )( void*, int ), void( *addFreund )( void*, int ),
-					  void( *accountAnsehen )( void *, int ), void *param )
-: addChat( addChat ),
-  addFreund( addFreund ),
-  accountAnsehen( accountAnsehen ),
-  nachrichtParam( nachrichtParam ),
-  eigeneId( eigeneId ),
-  spieler( new RCArray< ChatListeSpieler >() ),
-  vScroll( new VScrollBar() ),
-  pos( 420, 295 ),
-  gr( 150, 150 ),
-  infoc( infoc ),
-  schrift( schrift ),
-  bilder( bilder ),
-  ram( new LRahmen() ),
-  rend( 0 ),
-  ref( 1 )
+ChatListe::ChatListe( int eigeneId, KSGClient::InformationServerClient *infoc, UIInit &uiFactory, BilderV *bilder,
+                      void( *addChat )( void *, int ), void( *addFreund )( void *, int ),
+                      void( *accountAnsehen )( void *, int ), void *param )
+    : ReferenceCounter(),
+    addChat( addChat ),
+    addFreund( addFreund ),
+    accountAnsehen( accountAnsehen ),
+    nachrichtParam( nachrichtParam ),
+    eigeneId( eigeneId ),
+    spieler( new RCArray< ChatListeSpieler >() ),
+    vScroll( new VScrollBar() ),
+    pos( 420, 295 ),
+    gr( 150, 150 ),
+    infoc( infoc ),
+    uiFactory( uiFactory ),
+    bilder( bilder ),
+    ram( new LRahmen() ),
+    rend( 0 )
 {
-	vScroll->setKlickScroll( 10 );
-	vScroll->update( 0, 148 );
-	ram->setFarbe( 0xFFFFFFFF );
-	ram->setSize( 150, 150 );
+    vScroll->setKlickScroll( 10 );
+    vScroll->update( 0, 148 );
+    ram->setFarbe( 0xFFFFFFFF );
+    ram->setSize( 150, 150 );
 }
 
 // Destruktor
 ChatListe::~ChatListe()
 {
-	spieler->release();
-	vScroll->release();
-	infoc->release();
-	schrift->release();
-	ram->release();
+    spieler->release();
+    vScroll->release();
+    infoc->release();
+    ram->release();
 }
 
 // nicht constant
 void ChatListe::addSpieler( int accountId, bool istFreund )
 {
-	int anz = spieler->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		if( spieler->z( i ) && spieler->z( i )->getAccountId() == accountId )
-			return;
-	}
-	ChatListeSpieler *s = new ChatListeSpieler( accountId, eigeneId, schrift, bilder, infoc, istFreund, addChat, addFreund, accountAnsehen, nachrichtParam );
-	s->setPosition( anz * 20 );
-	spieler->add( s );
-	rend = 1;
+    int anz = spieler->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( spieler->z( i ) && spieler->z( i )->getAccountId() == accountId )
+            return;
+    }
+    ChatListeSpieler *s = new ChatListeSpieler( accountId, eigeneId, uiFactory, bilder, infoc, istFreund, addChat, addFreund, accountAnsehen, nachrichtParam );
+    s->setPosition( anz * 20 );
+    spieler->add( s );
+    rend = 1;
 }
 
 void ChatListe::setOffline( int accountId )
 {
-	int anz = spieler->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		if( spieler->z( i ) && spieler->z( i )->getAccountId() == accountId )
-		{
-			spieler->z( i )->setOffline();
-			return;
-		}
-	}
+    int anz = spieler->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( spieler->z( i ) && spieler->z( i )->getAccountId() == accountId )
+        {
+            spieler->z( i )->setOffline();
+            return;
+        }
+    }
 }
 
 void ChatListe::doPublicMausEreignis( MausEreignis &me )
 {
-	int mx = me.mx;
-	int my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y - vScroll->getScroll();
-	vScroll->doMausMessage( 134, 1, 15, 148, me );
-	int anz = spieler->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		if( spieler->z( i ) )
-			spieler->z( i )->doPublicMausEreignis( me );
-	}
-	me.mx = mx;
-	me.my = my;
+    int mx = me.mx;
+    int my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y - vScroll->getScroll();
+    vScroll->doMausMessage( 134, 1, 15, 148, me );
+    int anz = spieler->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( spieler->z( i ) )
+            spieler->z( i )->doPublicMausEreignis( me );
+    }
+    me.mx = mx;
+    me.my = my;
 }
 
 bool ChatListe::tick( double tickVal )
 {
-	rend |= vScroll->getRend();
-	int anz = spieler->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		if( spieler->z( i ) )
-			rend |= spieler->z( i )->tick( tickVal );
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= vScroll->getRend();
+    int anz = spieler->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( spieler->z( i ) )
+            rend |= spieler->z( i )->tick( tickVal );
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void ChatListe::render( Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( pos, gr ) )
-		return;
-	int anz = spieler->getEintragAnzahl();
-	zRObj.addScrollOffset( 0, vScroll->getScroll() );
-	for( int i = 0; i < anz; i++ )
-	{
-		if( spieler->z( i ) )
-			spieler->z( i )->render( zRObj );
-	}
-	zRObj.addScrollOffset( 0, -vScroll->getScroll() );
-	vScroll->render( 134, 1, 15, 148, zRObj );
-	ram->render( zRObj );
-	zRObj.releaseDrawOptions();
-}
-
-// constant
-
-// Reference Counting
-ChatListe *ChatListe::getThis()
-{
-	ref++;
-	return this;
-}
-
-ChatListe *ChatListe::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    if( !zRObj.setDrawOptions( pos, gr ) )
+        return;
+    int anz = spieler->getEintragAnzahl();
+    zRObj.addScrollOffset( 0, vScroll->getScroll() );
+    for( int i = 0; i < anz; i++ )
+    {
+        if( spieler->z( i ) )
+            spieler->z( i )->render( zRObj );
+    }
+    zRObj.addScrollOffset( 0, -vScroll->getScroll() );
+    vScroll->render( 134, 1, 15, 148, zRObj );
+    ram->render( zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 
 // Inhalt der StatistikChat Klasse aus StatistikChat.h
 // Konstruktor
-StatistikChat::StatistikChat( int eigeneId, KSGClient::SpielServerClient *spielc, KSGClient::InformationServerClient *infoc, Schrift *schrift, BilderV *bilder,
-							  void( *addNachricht )( void *, Text *, Text *, Text *, Text * ),
-							  void( *addChat )( void*, int ), void( *addFreund )( void*, int ),
-							  void( *accountAnsehen )( void *, int ), void *param )
-: addNachricht( addNachricht ),
-  nachrichtParam( nachrichtParam ),
-  spielc( spielc ),
-  infoc( infoc ),
-  verlauf( initTextFeld( 10, 295, 400, 150, schrift, TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VScroll | TextFeld::Style::Mehrzeilig, "" ) ),
-  nachricht( initTextFeld( 10, 450, 375, 20, schrift, TextFeld::Style::TextFeld, "" ) ),
-  senden( initKnopf( 390, 450, 20, 20, 0, 0, "" ) ),
-  verlassen( initKnopf( 430, 450, 130, 20, schrift, Knopf::Style::Sichtbar, "Verlassen" ) ),
-  spielerListe( new ChatListe( eigeneId, infoc->getThis(), schrift, bilder, addChat, addFreund, accountAnsehen, nachrichtParam ) ),
-  beenden( 0 ),
-  ref( 1 )
+StatistikChat::StatistikChat( int eigeneId, KSGClient::SpielServerClient *spielc, KSGClient::InformationServerClient *infoc, UIInit &uiFactory, BilderV *bilder,
+                              void( *addNachricht )( void *, Text *, Text *, Text *, Text * ),
+                              void( *addChat )( void *, int ), void( *addFreund )( void *, int ),
+                              void( *accountAnsehen )( void *, int ), void *param )
+    : ReferenceCounter(),
+    addNachricht( addNachricht ),
+    nachrichtParam( nachrichtParam ),
+    spielc( spielc ),
+    infoc( infoc ),
+    verlauf( uiFactory.createTextFeld( uiFactory.initParam ) ),
+    nachricht( uiFactory.createTextFeld( uiFactory.initParam ) ),
+    senden( uiFactory.createKnopf( uiFactory.initParam ) ),
+    verlassen( uiFactory.createKnopf( uiFactory.initParam ) ),
+    spielerListe( new ChatListe( eigeneId, infoc->getThis(), uiFactory, bilder, addChat, addFreund, accountAnsehen, nachrichtParam ) ),
+    beenden( 0 )
 {
-	Bild *sendenBild = bilder->get( "data/client/bilder/chat.ltdb/senden.png" );
-	senden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	senden->setHintergrundBildZ( sendenBild );
+    verlauf->setPosition( 10, 295 );
+    verlauf->setSize( 400, 150 );
+    verlauf->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VScroll | TextFeld::Style::Mehrzeilig );
+    verlauf->setText( "" );
+    nachricht->setPosition( 10, 450 );
+    nachricht->setSize( 375, 20 );
+    nachricht->setStyle( TextFeld::Style::TextFeld );
+    nachricht->setText( "" );
+    senden->setPosition( 390, 450 );
+    senden->setSize( 20, 20 );
+    senden->setText( "" );
+    verlassen->setPosition( 430, 450 );
+    verlassen->setSize( 130, 20 );
+    verlassen->setText( "Verlassen" );
+    Bild *sendenBild = bilder->get( "data/client/bilder/chat.ltdb/senden.png" );
+    senden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    senden->setHintergrundBildZ( sendenBild );
 }
 
 // Destruktor
 StatistikChat::~StatistikChat()
 {
-	spielc->release();
-	infoc->release();
-	verlauf->release();
-	nachricht->release();
-	senden->release();
-	verlassen->release();
-	spielerListe->release();
+    spielc->release();
+    infoc->release();
+    verlauf->release();
+    nachricht->release();
+    senden->release();
+    verlassen->release();
+    spielerListe->release();
 }
 
 // nicht constant
 void StatistikChat::addSpieler( int accountId, bool istFreund )
 {
-	spielerListe->addSpieler( accountId, istFreund );
+    spielerListe->addSpieler( accountId, istFreund );
 }
 
 void StatistikChat::spielerOffline( int accountId )
 {
-	spielerListe->setOffline( accountId );
+    spielerListe->setOffline( accountId );
 }
 
 void StatistikChat::addChatNachricht( int vonAccount, char *nachricht )
 {
-	Text *txt = vonAccount ? infoc->getSpielerName( vonAccount ) : 0;
-	if( !txt )
-		txt = new Text();
-	else
-		*txt += ": ";
-	*txt += nachricht;
-	*txt += "\n";
-	verlauf->zTextRenderer()->textFormatieren( txt, verlauf->getBreite() - 15 );
-	verlauf->zText()->append( txt );
-	verlauf->updateVScroll();
+    Text *txt = vonAccount ? infoc->getSpielerName( vonAccount ) : 0;
+    if( !txt )
+        txt = new Text();
+    else
+        *txt += ": ";
+    *txt += nachricht;
+    *txt += "\n";
+    verlauf->zTextRenderer()->textFormatieren( txt, verlauf->getBreite() - 15 );
+    verlauf->zText()->append( txt );
+    verlauf->updateVScroll();
 }
 
 void StatistikChat::doPublicMausEreignis( MausEreignis &me )
 {
-	verlauf->doPublicMausEreignis( me );
-	nachricht->doPublicMausEreignis( me );
-	spielerListe->doPublicMausEreignis( me );
-	bool vera = me.verarbeitet;
-	senden->doPublicMausEreignis( me );
-	int aktion = ( me.verarbeitet && !vera ) ? 1 : 0;
-	verlassen->doPublicMausEreignis( me );
-	aktion = ( me.verarbeitet && !vera && !aktion ) ? 2 : aktion;
-	if( me.id == ME_RLinks )
-	{
-		if( aktion == 1 )
-		{
-			if( nachricht->zText()->getLength() )
-			{
-				short län = 1 + nachricht->zText()->getLength();
-				char *bytes = new char[ län ];
-				bytes[ 0 ] = 2;
-				for( int i = 0; i < län - 1; i++ )
-					bytes[ i + 1 ] = nachricht->zText()->getText()[ i ];
-				if( !spielc->statistikNachricht( län, bytes ) )
-					addNachricht( nachrichtParam, new Text( "Fehler" ), new Text( "Die Nachricht konnte nicht gesendet werden." ), new Text( "Ok" ), 0 );
-				else
-				{
-					nachricht->setAuswahl( 0, 0 );
-					nachricht->setText( "" );
-				}
-				delete[] bytes;
-			}
-		}
-		if( aktion == 2 )
-			beenden = 1;
-	}
+    verlauf->doPublicMausEreignis( me );
+    nachricht->doPublicMausEreignis( me );
+    spielerListe->doPublicMausEreignis( me );
+    bool vera = me.verarbeitet;
+    senden->doPublicMausEreignis( me );
+    int aktion = ( me.verarbeitet && !vera ) ? 1 : 0;
+    verlassen->doPublicMausEreignis( me );
+    aktion = ( me.verarbeitet && !vera && !aktion ) ? 2 : aktion;
+    if( me.id == ME_RLinks )
+    {
+        if( aktion == 1 )
+        {
+            if( nachricht->zText()->getLength() )
+            {
+                short län = 1 + nachricht->zText()->getLength();
+                char *bytes = new char[ län ];
+                bytes[ 0 ] = 2;
+                for( int i = 0; i < län - 1; i++ )
+                    bytes[ i + 1 ] = nachricht->zText()->getText()[ i ];
+                if( !spielc->statistikNachricht( län, bytes ) )
+                    addNachricht( nachrichtParam, new Text( "Fehler" ), new Text( "Die Nachricht konnte nicht gesendet werden." ), new Text( "Ok" ), 0 );
+                else
+                {
+                    nachricht->setAuswahl( 0, 0 );
+                    nachricht->setText( "" );
+                }
+                delete[] bytes;
+            }
+        }
+        if( aktion == 2 )
+            beenden = 1;
+    }
 }
 
 void StatistikChat::doTastaturEreignis( TastaturEreignis &te )
 {
-	bool vera = te.verarbeitet;
-	nachricht->doTastaturEreignis( te );
-	if( !vera && te.verarbeitet && te.id == TE_Release && te.taste == T_Enter )
-	{
-		if( nachricht->zText()->getLength() )
-		{
-			short län = 1 + nachricht->zText()->getLength();
-			char *bytes = new char[ län ];
-			bytes[ 0 ] = 2;
-			for( int i = 0; i < län - 1; i++ )
-				bytes[ i + 1 ] = nachricht->zText()->getText()[ i ];
-			if( !spielc->statistikNachricht( län, bytes ) )
-				addNachricht( nachrichtParam, new Text( "Fehler" ), new Text( "Die Nachricht konnte nicht gesendet werden." ), new Text( "Ok" ), 0 );
-			else
-			{
-				nachricht->setAuswahl( 0, 0 );
-				nachricht->setText( "" );
-			}
-			delete[] bytes;
-		}
-	}
+    bool vera = te.verarbeitet;
+    nachricht->doTastaturEreignis( te );
+    if( !vera && te.verarbeitet && te.id == TE_Release && te.taste == T_Enter )
+    {
+        if( nachricht->zText()->getLength() )
+        {
+            short län = 1 + nachricht->zText()->getLength();
+            char *bytes = new char[ län ];
+            bytes[ 0 ] = 2;
+            for( int i = 0; i < län - 1; i++ )
+                bytes[ i + 1 ] = nachricht->zText()->getText()[ i ];
+            if( !spielc->statistikNachricht( län, bytes ) )
+                addNachricht( nachrichtParam, new Text( "Fehler" ), new Text( "Die Nachricht konnte nicht gesendet werden." ), new Text( "Ok" ), 0 );
+            else
+            {
+                nachricht->setAuswahl( 0, 0 );
+                nachricht->setText( "" );
+            }
+            delete[] bytes;
+        }
+    }
 }
 
 bool StatistikChat::tick( double tickVal )
 {
-	bool rend = verlauf->tick( tickVal );
-	rend |= nachricht->tick( tickVal );
-	rend |= senden->tick( tickVal );
-	rend |= verlassen->tick( tickVal );
-	rend |= spielerListe->tick( tickVal );
-	return rend;
+    bool rend = verlauf->tick( tickVal );
+    rend |= nachricht->tick( tickVal );
+    rend |= senden->tick( tickVal );
+    rend |= verlassen->tick( tickVal );
+    rend |= spielerListe->tick( tickVal );
+    return rend;
 }
 
 void StatistikChat::render( Bild &zRObj )
 {
-	verlauf->render( zRObj );
-	nachricht->render( zRObj );
-	senden->render( zRObj );
-	verlassen->render( zRObj );
-	spielerListe->render( zRObj );
+    verlauf->render( zRObj );
+    nachricht->render( zRObj );
+    senden->render( zRObj );
+    verlassen->render( zRObj );
+    spielerListe->render( zRObj );
 }
 
 // constant
-bool StatistikChat::hatVerlassen()
-{
-	return beenden;
-}
-
-// Reference Counting
-StatistikChat *StatistikChat::getThis()
-{
-	ref++;
-	return this;
-}
-
-StatistikChat *StatistikChat::release()
+bool StatistikChat::hatVerlassen() const
 {
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return beenden;
 }

+ 88 - 101
Linie/SpielStatistik/Chat/StatistikChat.h

@@ -5,127 +5,114 @@
 #include <Knopf.h>
 #include <KSGNetwork.h>
 #include <BilderV.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 
-class ChatListeSpieler
+class ChatListeSpieler : public virtual ReferenceCounter
 {
 private:
-	void( *addChatF )( void *, int );
-	void( *addFreundF )( void *, int );
-	void( *accountAnsehenF )( void *, int );
-	void *nachrichtParam;
-	int accountId;
-	AlphaFeld *bg;
-	TextFeld *name;
-	Knopf *accountAnsehen;
-	Knopf *nachrichtSenden;
-	Knopf *freundesanfrageSenden;
-	Punkt pos;
-	Punkt gr;
-	bool online;
-	int minKnopfX;
-	int knopfX;
-	bool mausIn;
-	double tickVal;
-	bool rend;
-	int ref;
+    void( *addChatF )( void *, int );
+    void( *addFreundF )( void *, int );
+    void( *accountAnsehenF )( void *, int );
+    void *nachrichtParam;
+    int accountId;
+    AlphaFeld *bg;
+    TextFeld *name;
+    Knopf *accountAnsehen;
+    Knopf *nachrichtSenden;
+    Knopf *freundesanfrageSenden;
+    Punkt pos;
+    Punkt gr;
+    bool online;
+    int minKnopfX;
+    int knopfX;
+    bool mausIn;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	 ChatListeSpieler( int accountId, int eigeneId, Schrift *zSchrift, BilderV *bilder, KSGClient::InformationServerClient *zInfoc,
-											  bool istFreund, void( *addChatF )( void*, int ), void( *addFreundF )( void*, int ),
-											  void( *accountAnsehenF )( void *, int ), void *param );
-	// Destruktor
-	 ~ChatListeSpieler();
-	// nicht constant
-	 void setOffline();
-	 void setPosition( int y );
-	 void doPublicMausEreignis( MausEreignis &me );
-	 bool tick( double tickVal );
-	 void render( Bild &zRObj );
-	// constant
-	 int getAccountId() const;
-	// Reference Counting
-	 ChatListeSpieler *getThis();
-	 ChatListeSpieler *release();
+    // Konstruktor
+    ChatListeSpieler( int accountId, int eigeneId, UIInit &uiFactory, BilderV *bilder, KSGClient::InformationServerClient *zInfoc,
+                      bool istFreund, void( *addChatF )( void *, int ), void( *addFreundF )( void *, int ),
+                      void( *accountAnsehenF )( void *, int ), void *param );
+    // Destruktor
+    ~ChatListeSpieler();
+    // nicht constant
+    void setOffline();
+    void setPosition( int y );
+    void doPublicMausEreignis( MausEreignis &me );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    // constant
+    int getAccountId() const;
 };
 
-class ChatListe
+class ChatListe : public virtual ReferenceCounter
 {
 private:
-	void( *addChat )( void *, int );
-	void( *addFreund )( void *, int );
-	void( *accountAnsehen )( void *, int );
-	void *nachrichtParam;
-	int eigeneId;
-	RCArray< ChatListeSpieler > *spieler;
-	VScrollBar *vScroll;
-	Punkt pos;
-	Punkt gr;
+    void( *addChat )( void *, int );
+    void( *addFreund )( void *, int );
+    void( *accountAnsehen )( void *, int );
+    void *nachrichtParam;
+    int eigeneId;
+    RCArray< ChatListeSpieler > *spieler;
+    VScrollBar *vScroll;
+    Punkt pos;
+    Punkt gr;
     KSGClient::InformationServerClient *infoc;
-	Schrift *schrift;
-	BilderV *bilder;
-	Rahmen *ram;
-	bool rend;
-	int ref;
+    UIInit uiFactory;
+    BilderV *bilder;
+    Rahmen *ram;
+    bool rend;
 
 public:
-	// Konstruktor
-	 ChatListe( int eigeneId, KSGClient::InformationServerClient *infoc, Schrift *schrift, BilderV *bilder,
-									   void( *addChat )( void*, int ), void( *addFreund )( void*, int ),
-									   void( *accountAnsehen )( void *, int ), void *param );
-	// Destruktor
-	 ~ChatListe();
-	// nicht constant
-	 void addSpieler( int accountId, bool istFreund );
-	 void setOffline( int accountId );
-	 void doPublicMausEreignis( MausEreignis &me );
-	 bool tick( double tickVal );
-	 void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	 ChatListe *getThis();
-	 ChatListe *release();
+    // Konstruktor
+    ChatListe( int eigeneId, KSGClient::InformationServerClient *infoc, UIInit &uiFactory, BilderV *bilder,
+               void( *addChat )( void *, int ), void( *addFreund )( void *, int ),
+               void( *accountAnsehen )( void *, int ), void *param );
+    // Destruktor
+    ~ChatListe();
+    // nicht constant
+    void addSpieler( int accountId, bool istFreund );
+    void setOffline( int accountId );
+    void doPublicMausEreignis( MausEreignis &me );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
 };
 
-class StatistikChat
+class StatistikChat : public virtual ReferenceCounter
 {
 private:
-	void( *addNachricht )( void *, Text *, Text *, Text *, Text * );
-	void *nachrichtParam;
-	KSGClient::SpielServerClient *spielc;
-	KSGClient::InformationServerClient *infoc;
-	TextFeld *verlauf;
-	TextFeld *nachricht;
-	Knopf *senden;
-	Knopf *verlassen;
-	ChatListe *spielerListe;
-	bool beenden;
-	int ref;
+    void( *addNachricht )( void *, Text *, Text *, Text *, Text * );
+    void *nachrichtParam;
+    KSGClient::SpielServerClient *spielc;
+    KSGClient::InformationServerClient *infoc;
+    TextFeld *verlauf;
+    TextFeld *nachricht;
+    Knopf *senden;
+    Knopf *verlassen;
+    ChatListe *spielerListe;
+    bool beenden;
 
 public:
-	// Konstruktor
-	StatistikChat( int eigeneId, KSGClient::SpielServerClient *spielc, KSGClient::InformationServerClient *infoc, Schrift *schrift, BilderV *bilder,
-										   void( *addNachricht )( void *, Text *, Text *, Text *, Text * ),
-										   void( *addChat )( void*, int ), void( *addFreund )( void*, int ),
-										   void( *accountAnsehen )( void *, int ), void *param );
-	// Destruktor
-	~StatistikChat();
-	// nicht constant
-	void addSpieler( int accountId, bool istFreund );
-	void spielerOffline( int accountId );
-	void addChatNachricht( int vonAccount, char *nachricht );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double tickVal );
-	void render( Bild &zRObj );
-	// constant
-	bool hatVerlassen();
-	// Reference Counting
-	StatistikChat *getThis();
-	StatistikChat *release();
+    // Konstruktor
+    StatistikChat( int eigeneId, KSGClient::SpielServerClient *spielc, KSGClient::InformationServerClient *infoc, UIInit &uiFactory, BilderV *bilder,
+                   void( *addNachricht )( void *, Text *, Text *, Text *, Text * ),
+                   void( *addChat )( void *, int ), void( *addFreund )( void *, int ),
+                   void( *accountAnsehen )( void *, int ), void *param );
+    // Destruktor
+    ~StatistikChat();
+    // nicht constant
+    void addSpieler( int accountId, bool istFreund );
+    void spielerOffline( int accountId );
+    void addChatNachricht( int vonAccount, char *nachricht );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    // constant
+    bool hatVerlassen() const;
 };
 
 #endif

+ 108 - 107
Linie/SpielStatistik/Runde/StatistikRunde.cpp

@@ -1,142 +1,143 @@
 #include "StatistikRunde.h"
-#include "../../Initialisierung/Initialisierung.h"
 #include <Punkt.h>
 
 // Inhalt der StatistikRunde Klasse aus StatistikRunde.h
 // Konstruktor
-StatistikRunde::StatistikRunde( Schrift *zSchrift, Array< SSDRunde* > *dat, bool historie )
-	: rundenBild( initBildZ( 525, 40, 245, 245, BildZ::Style::normal, 0 ) ),
-  rundenNummer( initTextFeld( 580, 295, 190, 20, zSchrift, TextFeld::Style::Text, "Runde: " ) ),
-  rundenDauer( initTextFeld( 580, 325, 190, 20, zSchrift, TextFeld::Style::Text, "Dauer: " ) ),
-  rundenSieger( initTextFeld( 580, 355, 190, 20, zSchrift, TextFeld::Style::Text, "Sieger: " ) ),
-  spielfeldNutzung( initTextFeld( 580, 385, 190, 20, zSchrift, TextFeld::Style::Text, "Spielfeldnutzung: " ) ),
-  verbleibend( initTextFeld( 580, 415, 190, 20, zSchrift, TextFeld::Style::Text, "Verbleibende Zeit: 300" ) ),
-  daten( dat ),
-  auswahl( -1 ),
-  verb( 300 ),
-  rend( 0 ),
-  ref( 1 )
+StatistikRunde::StatistikRunde( UIInit &uiFactory, Array< SSDRunde * > *dat, bool historie )
+    : ReferenceCounter(),
+    rundenBild( uiFactory.createBildZ( uiFactory.initParam ) ),
+    rundenNummer( uiFactory.createTextFeld( uiFactory.initParam ) ),
+    rundenDauer( uiFactory.createTextFeld( uiFactory.initParam ) ),
+    rundenSieger( uiFactory.createTextFeld( uiFactory.initParam ) ),
+    spielfeldNutzung( uiFactory.createTextFeld( uiFactory.initParam ) ),
+    verbleibend( uiFactory.createTextFeld( uiFactory.initParam ) ),
+    daten( dat ),
+    auswahl( -1 ),
+    verb( 300 ),
+    rend( 0 )
 {
-	if( historie )
-	{
-		verbleibend->removeStyle( TextFeld::Style::Sichtbar );
-		rundenBild->setPosition( 520, 10 );
-		rundenBild->setSize( 250, 250 );
-		rundenNummer->setPosition( 520, 270 );
-		rundenDauer->setPosition( 520, 300 );
-		rundenSieger->setPosition( 520, 330 );
-		spielfeldNutzung->setPosition( 520, 360 );
-	}
+    rundenBild->setPosition( 525, 40 );
+    rundenBild->setSize( 245, 245 );
+    rundenNummer->setPosition( 580, 295 );
+    rundenNummer->setSize( 190, 20 );
+    rundenNummer->setText( "Runde: " );
+    rundenDauer->setPosition( 580, 325 );
+    rundenDauer->setSize( 190, 20 );
+    rundenDauer->setText( "Dauer: " );
+    rundenSieger->setPosition( 580, 355 );
+    rundenSieger->setSize( 190, 20 );
+    rundenSieger->setText( "Sieger: " );
+    spielfeldNutzung->setPosition( 580, 385 );
+    spielfeldNutzung->setSize( 190, 20 );
+    spielfeldNutzung->setText( "Spielfeldnutzung: " );
+    verbleibend->setPosition( 580, 415 );
+    verbleibend->setSize( 190, 20 );
+    verbleibend->setText( "Verbleibende Zeit: 300" );
+    if( historie )
+    {
+        verbleibend->removeStyle( TextFeld::Style::Sichtbar );
+        rundenBild->setPosition( 520, 10 );
+        rundenBild->setSize( 250, 250 );
+        rundenNummer->setPosition( 520, 270 );
+        rundenDauer->setPosition( 520, 300 );
+        rundenSieger->setPosition( 520, 330 );
+        spielfeldNutzung->setPosition( 520, 360 );
+    }
 }
 
 // Destruktor 
 StatistikRunde::~StatistikRunde()
 {
     rundenBild->release();
-	rundenNummer->release();
-	rundenDauer->release();
-	rundenSieger->release();
-	spielfeldNutzung->release();
-	verbleibend->release();
-	daten->release();
+    rundenNummer->release();
+    rundenDauer->release();
+    rundenSieger->release();
+    spielfeldNutzung->release();
+    verbleibend->release();
+    daten->release();
 }
 
 // nicht constant
 void StatistikRunde::setRunde( int nummer )
 {
-	if( nummer != auswahl )
-	{
-		Bild *b = new Bild();
-		b->neuBild( 1, 1, 0 );
-		rundenBild->setBildZ( b );
-		rundenNummer->setText( "Runde: " );
-		rundenDauer->setText( "Dauer: " );
-		rundenSieger->setText( "Sieger: " );
-		spielfeldNutzung->setText( "Spielfeldnutzung: " );
-		int anz = daten->getEintragAnzahl();
-		for( int i = 0; i < anz; i++ )
-		{
-			if( daten->hat( i ) && daten->get( i )->rundenNummer == nummer )
-			{
-				Bild *b = new Bild();
-				b->neuBild( daten->get( i )->rundenBild.getBreite(), daten->get( i )->rundenBild.getHeight(), 0 );
-				b->drawBild( 0, 0, b->getBreite(), b->getHeight(), daten->get( i )->rundenBild );
-				rundenBild->setBildZ( b );
-				*rundenNummer->zText() += nummer + 1;
-				*rundenDauer->zText() += daten->get( i )->rundenDauer / 60;
-				*rundenDauer->zText() += ":";
-				*rundenDauer->zText() += daten->get( i )->rundenDauer % 60;
-				int anz2 = daten->get( i )->teams.getEintragAnzahl();
-				for( int j = 0; j < anz; j++ )
-				{
-					if( daten->get( i )->teams.hat( j ) && daten->get( i )->teams.get( j )->teamNummer == daten->get( i )->rundenSieger )
-					{
-						*rundenSieger->zText() += daten->get( i )->teams.get( j )->teamName.getText();
-						break;
-					}
-				}
-				*spielfeldNutzung->zText() += daten->get( i )->spielfeldNutzung;
-				*spielfeldNutzung->zText() += "%";
-				auswahl = nummer;
-				rend = 1;
-				return;
-			}
-		}
-		auswahl = -1;
-		rend = 1;
-	}
+    if( nummer != auswahl )
+    {
+        Bild *b = new Bild();
+        b->neuBild( 1, 1, 0 );
+        rundenBild->setBildZ( b );
+        rundenNummer->setText( "Runde: " );
+        rundenDauer->setText( "Dauer: " );
+        rundenSieger->setText( "Sieger: " );
+        spielfeldNutzung->setText( "Spielfeldnutzung: " );
+        int anz = daten->getEintragAnzahl();
+        for( int i = 0; i < anz; i++ )
+        {
+            if( daten->hat( i ) && daten->get( i )->rundenNummer == nummer )
+            {
+                Bild *b = new Bild();
+                b->neuBild( daten->get( i )->rundenBild.getBreite(), daten->get( i )->rundenBild.getHeight(), 0 );
+                b->drawBild( 0, 0, b->getBreite(), b->getHeight(), daten->get( i )->rundenBild );
+                rundenBild->setBildZ( b );
+                *rundenNummer->zText() += nummer + 1;
+                *rundenDauer->zText() += daten->get( i )->rundenDauer / 60;
+                *rundenDauer->zText() += ":";
+                *rundenDauer->zText() += daten->get( i )->rundenDauer % 60;
+                int anz2 = daten->get( i )->teams.getEintragAnzahl();
+                for( int j = 0; j < anz; j++ )
+                {
+                    if( daten->get( i )->teams.hat( j ) && daten->get( i )->teams.get( j )->teamNummer == daten->get( i )->rundenSieger )
+                    {
+                        *rundenSieger->zText() += daten->get( i )->teams.get( j )->teamName.getText();
+                        break;
+                    }
+                }
+                *spielfeldNutzung->zText() += daten->get( i )->spielfeldNutzung;
+                *spielfeldNutzung->zText() += "%";
+                auswahl = nummer;
+                rend = 1;
+                return;
+            }
+        }
+        auswahl = -1;
+        rend = 1;
+    }
 }
 
 void StatistikRunde::doPublicMausEreignis( MausEreignis &me )
 {
-	rundenBild->doPublicMausEreignis( me );
+    rundenBild->doPublicMausEreignis( me );
 }
 
 bool StatistikRunde::tick( double tickVal )
 {
-	int verbl = (int)verb;
-	verb -= tickVal;
-	if( verb < 0 )
-		verb = 0;
-	if( verbl != (int)verb )
-	{
-		verbleibend->setText( "Verbleibende Zeit: " );
-		*verbleibend->zText() += (int)verb;
-		rend = 1;
-	}
-	rend |= rundenBild->tick( tickVal );
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    int verbl = (int)verb;
+    verb -= tickVal;
+    if( verb < 0 )
+        verb = 0;
+    if( verbl != (int)verb )
+    {
+        verbleibend->setText( "Verbleibende Zeit: " );
+        *verbleibend->zText() += (int)verb;
+        rend = 1;
+    }
+    rend |= rundenBild->tick( tickVal );
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void StatistikRunde::render( Bild &zRObj )
 {
-	rundenBild->render( zRObj );
-	rundenNummer->render( zRObj );
-	rundenDauer->render( zRObj );
-	rundenSieger->render( zRObj );
-	spielfeldNutzung->render( zRObj );
-	verbleibend->render( zRObj );
+    rundenBild->render( zRObj );
+    rundenNummer->render( zRObj );
+    rundenDauer->render( zRObj );
+    rundenSieger->render( zRObj );
+    spielfeldNutzung->render( zRObj );
+    verbleibend->render( zRObj );
 }
 
 // constant
 bool StatistikRunde::mussVerlassen() const
 {
-	return verb == 0;
-}
-
-// Reference Counting
-StatistikRunde *StatistikRunde::getThis()
-{
-	ref++;
-	return this;
-}
-
-StatistikRunde *StatistikRunde::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return verb == 0;
 }

+ 23 - 26
Linie/SpielStatistik/Runde/StatistikRunde.h

@@ -3,40 +3,37 @@
 
 #include <Bild.h>
 #include <TextFeld.h>
+#include <UIInitialization.h>
 #include "../SpielStatistikDaten.h"
 
 using namespace Framework;
 
-class StatistikRunde
+class StatistikRunde : public virtual ReferenceCounter
 {
 private:
-	BildZ *rundenBild;
-	TextFeld *rundenNummer;
-	TextFeld *rundenDauer;
-	TextFeld *rundenSieger;
-	TextFeld *spielfeldNutzung;
-	TextFeld *verbleibend;
-	Array< SSDRunde* > *daten;
-	int auswahl;
-	double verb;
-	bool rend;
-	int ref;
+    BildZ *rundenBild;
+    TextFeld *rundenNummer;
+    TextFeld *rundenDauer;
+    TextFeld *rundenSieger;
+    TextFeld *spielfeldNutzung;
+    TextFeld *verbleibend;
+    Array< SSDRunde * > *daten;
+    int auswahl;
+    double verb;
+    bool rend;
 
 public:
-	// Konstruktor
-	StatistikRunde( Schrift *zSchrift, Array< SSDRunde* > *dat, bool historie = 0 );
-	// Destruktor
-	~StatistikRunde();
-	// nicht constant
-	void setRunde( int nummer );
-	void doPublicMausEreignis( MausEreignis &me );
-	bool tick( double tickVal );
-	void render( Bild &zRObj );
-	// constant
-	bool mussVerlassen() const;
-	// Reference Counting
-	StatistikRunde *getThis();
-	StatistikRunde *release();
+    // Konstruktor
+    StatistikRunde( UIInit &uiFactory, Array< SSDRunde * > *dat, bool historie = 0 );
+    // Destruktor
+    ~StatistikRunde();
+    // nicht constant
+    void setRunde( int nummer );
+    void doPublicMausEreignis( MausEreignis &me );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    // constant
+    bool mussVerlassen() const;
 };
 
 #endif

+ 6 - 33
Linie/SpielStatistik/SpielStatistik.cpp

@@ -1,11 +1,11 @@
 #include "SpielStatistik.h"
-#include "../Initialisierung/Initialisierung.h"
 #include <MausEreignis.h>
 #include <Punkt.h>
 
 // Inhalt der SpielStatistik Klasse aus SpielStatistik.h
 // Konstruktor
 SpielStatistik::SpielStatistik()
+    : ReferenceCounter()
 {
     InitializeCriticalSection( &cs );
     addNachrichtF = 0;
@@ -15,8 +15,6 @@ SpielStatistik::SpielStatistik()
     istFreundF = 0;
     nachrichtParam = 0;
     bilder = 0;
-    schrift = 0;
-    screen = 0;
     infoc = 0;
     spielc = 0;
     status = 0;
@@ -28,7 +26,6 @@ SpielStatistik::SpielStatistik()
     tabelle = 0;
     accountId = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -40,8 +37,6 @@ SpielStatistik::~SpielStatistik()
         runde->release();
     if( tabelle )
         tabelle->release();
-    if( schrift )
-        schrift->release();
     if( infoc )
         infoc->release();
     if( spielc )
@@ -123,16 +118,9 @@ void SpielStatistik::setR
     this->nachrichtParam = nachrichtParam;
 }
 
-void SpielStatistik::setSchrift( Schrift *schrift )
+void SpielStatistik::setUIFactory( UIInit &factory )
 {
-    if( this->schrift )
-        this->schrift->release();
-    this->schrift = schrift;
-}
-
-void SpielStatistik::setBildschirm( Bildschirm *zScreen )
-{
-    screen = zScreen;
+    uiFactory = factory;
 }
 
 void SpielStatistik::setKlients( KSGClient::InformationServerClient *infoc, KSGClient::SpielServerClient *spielc )
@@ -156,7 +144,7 @@ void SpielStatistik::nachricht( int l
     case 1: // Ladevorgang abgeschlossen
         if( 1 )
         {
-            chat = new StatistikChat( accountId, dynamic_cast<KSGClient::SpielServerClient *>( spielc->getThis() ), dynamic_cast<KSGClient::InformationServerClient *>( infoc->getThis() ), dynamic_cast<Schrift *>( schrift->getThis() ), bilder, addNachrichtF, addChatF, addFreundF, accountAnsehenF, nachrichtParam );
+            chat = new StatistikChat( accountId, dynamic_cast<KSGClient::SpielServerClient *>( spielc->getThis() ), dynamic_cast<KSGClient::InformationServerClient *>( infoc->getThis() ), uiFactory, bilder, addNachrichtF, addChatF, addFreundF, accountAnsehenF, nachrichtParam );
             int anz = gss->getEintragAnzahl();
             for( int i = 0; i < anz; i++ )
             {
@@ -167,8 +155,8 @@ void SpielStatistik::nachricht( int l
                         chat->addSpieler( acc, istFreundF( nachrichtParam, acc ) || acc == accountId );
                 }
             }
-            runde = new StatistikRunde( schrift, dynamic_cast<Array<SSDRunde *> *>( rs->getThis() ) );
-            tabelle = new StatistikTabelle( dynamic_cast<Array<SSDGesamtSpieler *> *>( gss->getThis() ), dynamic_cast<Array<SSDGesamtTeam *> *>( gts->getThis() ), dynamic_cast<Array<SSDRunde *> *>( rs->getThis() ), schrift, screen );
+            runde = new StatistikRunde( uiFactory, dynamic_cast<Array<SSDRunde *> *>( rs->getThis() ) );
+            tabelle = new StatistikTabelle( dynamic_cast<Array<SSDGesamtSpieler *> *>( gss->getThis() ), dynamic_cast<Array<SSDGesamtTeam *> *>( gts->getThis() ), dynamic_cast<Array<SSDRunde *> *>( rs->getThis() ), uiFactory );
             status = 1;
         }
         break;
@@ -542,19 +530,4 @@ void SpielStatistik::verlassen()
 int SpielStatistik::getStatus() const // 0 = laden, 1 = läuft, 2 = fortsetzen
 {
     return status;
-}
-
-// Reference Counting
-SpielStatistikV *SpielStatistik::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpielStatistikV *SpielStatistik::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 43 - 49
Linie/SpielStatistik/SpielStatistik.h

@@ -10,57 +10,51 @@
 class SpielStatistik : public SpielStatistikV
 {
 private:
-	void( *addNachrichtF )( void *, Text *, Text *, Text *, Text * );
-	void( *addChatF )( void *, int );
-	void( *addFreundF )( void *, int );
-	void( *accountAnsehenF )( void *, int );
-	bool( *istFreundF )( void *, int );
-	void *nachrichtParam;
-	BilderV *bilder;
-	Schrift *schrift;
-	Bildschirm *screen;
-	KSGClient::InformationServerClient *infoc;
-	KSGClient::SpielServerClient *spielc;
-	CRITICAL_SECTION cs;
-	Array< SSDGesamtSpieler* > *gss;
-	Array< SSDGesamtTeam* > *gts;
-	Array< SSDRunde* > *rs;
-	StatistikChat *chat;
-	StatistikRunde *runde;
-	StatistikTabelle *tabelle;
-	int accountId;
-	bool rend;
-	int status;
-	int ref;
+    UIInit uiFactory;
+    void( *addNachrichtF )( void *, Text *, Text *, Text *, Text * );
+    void( *addChatF )( void *, int );
+    void( *addFreundF )( void *, int );
+    void( *accountAnsehenF )( void *, int );
+    bool( *istFreundF )( void *, int );
+    void *nachrichtParam;
+    BilderV *bilder;
+    KSGClient::InformationServerClient *infoc;
+    KSGClient::SpielServerClient *spielc;
+    CRITICAL_SECTION cs;
+    Array< SSDGesamtSpieler * > *gss;
+    Array< SSDGesamtTeam * > *gts;
+    Array< SSDRunde * > *rs;
+    StatistikChat *chat;
+    StatistikRunde *runde;
+    StatistikTabelle *tabelle;
+    int accountId;
+    bool rend;
+    int status;
 
 public:
-	// Konstruktor
-	SpielStatistik();
-	// Destruktor
-	~SpielStatistik();
-	// nicht constant
-	void lock();
-	void unlock();
-	virtual void bereit();
-	virtual void setBilder( BilderV *b );
-	virtual void setAccountId( int id );
-	virtual void setRückrufFunktionen( void( *addNachrichtF )( void *, Text *, Text *, Text *, Text * ),
-															   void( *addChatF )( void *, int ), void( *addFreundF )( void *, int ),
-															   void( *accountAnsehenF )( void *, int ), bool( *istFreundF )( void *, int ), void *nachrichtParam );
-	virtual void setSchrift( Schrift *schrift );
-	virtual void setBildschirm( Bildschirm *zScreen );
-	virtual void setKlients( KSGClient::InformationServerClient *infoc, KSGClient::SpielServerClient *spielc );
-	virtual void nachricht( int län, char *bytes );
-	virtual void doPublicMausEreignis( MausEreignis &me );
-	virtual void doTastaturEreignis( TastaturEreignis &te );
-	virtual bool tick( double zeit );
-	virtual void render( Bild &zRObj );
-	virtual void verlassen();
-	// constant
-	virtual int getStatus() const; // 0 = laden, 1 = läuft, 2 = fortsetzen
-	// Reference Counting
-	virtual SpielStatistikV *getThis();
-	virtual SpielStatistikV *release();
+    // Konstruktor
+    SpielStatistik();
+    // Destruktor
+    ~SpielStatistik();
+    // nicht constant
+    void lock();
+    void unlock();
+    virtual void bereit();
+    virtual void setBilder( BilderV *b );
+    virtual void setAccountId( int id );
+    virtual void setRückrufFunktionen( void( *addNachrichtF )( void *, Text *, Text *, Text *, Text * ),
+                                       void( *addChatF )( void *, int ), void( *addFreundF )( void *, int ),
+                                       void( *accountAnsehenF )( void *, int ), bool( *istFreundF )( void *, int ), void *nachrichtParam );
+    virtual void setUIFactory( UIInit &factory );
+    virtual void setKlients( KSGClient::InformationServerClient *infoc, KSGClient::SpielServerClient *spielc );
+    virtual void nachricht( int län, char *bytes );
+    virtual void doPublicMausEreignis( MausEreignis &me );
+    virtual void doTastaturEreignis( TastaturEreignis &te );
+    virtual bool tick( double zeit );
+    virtual void render( Bild &zRObj );
+    virtual void verlassen();
+    // constant
+    virtual int getStatus() const; // 0 = laden, 1 = läuft, 2 = fortsetzen
 };
 
 #endif

+ 161 - 70
Linie/SpielStatistik/Tabelle/StatistikTabelle.cpp

@@ -1,41 +1,148 @@
 #include "StatistikTabelle.h"
-#include "../../Initialisierung/Initialisierung.h"
+#include <TextFeld.h>
 
 #define ABSTYLE     AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::Hintergrund | AuswahlBox::Style::VScroll
 #define OTSTYLE     ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::Raster | ObjTabelle::Style::scroll | ObjTabelle::Style::SpaltenBreiteMax | ObjTabelle::Style::SpaltenBreiteMin | ObjTabelle::Style::SpaltenBreiteChangeable | ObjTabelle::Style::SpaltenBeweglich
 
+struct OBJTabelleSpalteIni
+{
+    char *name;
+    int breite;
+    int minBreite;
+    int maxBreite;
+};
+
+AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, UIInit &uiFactory, int style, std::initializer_list< char * > values )
+{
+    AuswahlBox *ret = uiFactory.createAuswahlBox( uiFactory.initParam );
+    ret->addStyle( style );
+    ret->setPosition( x, y );
+    ret->setSize( br, hö );
+    if( ( style | AuswahlBox::Style::Hintergrund ) == style )
+        ret->setHintergrundFarbe( 0xFF000000 );
+    if( ( style | AuswahlBox::Style::Erlaubt ) == style )
+        ret->setMausEreignis( _ret1ME );
+    if( ( style | AuswahlBox::Style::Rahmen ) == style )
+    {
+        ret->setRahmenBreite( 1 );
+        ret->setRahmenFarbe( 0xFFFFFFFF );
+    }
+    if( ( style | AuswahlBox::Style::MaxHeight ) == style )
+        ret->setMaxAuskappHeight( 100 );
+    if( ( style | AuswahlBox::Style::MausRahmen ) == style )
+    {
+        ret->setMausRahmenBreite( 1 );
+        ret->setMausRahmenFarbe( 0xFF005500 );
+    }
+    if( ( style | AuswahlBox::Style::MausBuffer ) == style )
+    {
+        ret->setMausAlphaFeldFarbe( 0x00008700 );
+        ret->setMausAlphaFeldStrength( -8 );
+    }
+    if( ( style | AuswahlBox::Style::AuswahlRahmen ) == style )
+    {
+        ret->setAuswRahmenBreite( 1 );
+        ret->setAuswRahmenFarbe( 0xFF00FF00 );
+    }
+    if( ( style | AuswahlBox::Style::AuswahlBuffer ) == style )
+    {
+        ret->setAuswAlphaFeldFarbe( 0x0000FF00 );
+        ret->setAuswAlphaFeldStrength( -8 );
+    }
+    for( auto i = values.begin(); i != values.end(); i++ )
+    {
+        ret->addEintrag( *i );
+    }
+    return ret;
+}
+
+ObjTabelle *initObjTabelle( int x, int y, int br, int hö, UIInit &uiFactory, int style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe )
+{
+    ObjTabelle *ret = uiFactory.createObjTabelle( uiFactory.initParam );
+    ret->addStyle( style );
+    ret->setPosition( x, y );
+    ret->setSize( br, hö );
+    if( ( style | ObjTabelle::Style::Erlaubt ) == style )
+        ret->setMausEreignis( _ret1ME );
+    if( ( style | ObjTabelle::Style::Rahmen ) == style )
+    {
+        ret->setRahmenBreite( 1 );
+        ret->setRahmenFarbe( 0xFFFFFFFF );
+    }
+    if( ( style | ObjTabelle::Style::Raster ) == style )
+    {
+        ret->setRasterBreite( 1 );
+        ret->setRasterFarbe( 0xFFFFFFFF );
+    }
+    if( ( style | ObjTabelle::Style::VScroll ) == style )
+        ret->setVertikalKlickScroll( 5 );
+    if( ( style | ObjTabelle::Style::HScroll ) == style )
+        ret->setHorizontalKlickScroll( 5 );
+    for( auto i = spalten.begin(); i != spalten.end(); i++ )
+    {
+        ret->addSpalte( i->name );
+        ret->setSpaltenBreite( i->name, i->breite );
+        if( ( style | ObjTabelle::Style::SpaltenBreiteMin ) == style )
+            ret->setMinSpaltenBreite( i->name, i->minBreite );
+        if( ( style | ObjTabelle::Style::SpaltenBreiteMax ) == style )
+            ret->setMaxSpaltenBreite( i->name, i->maxBreite );
+        if( überschriftHöhe )
+        {
+            if( ret->getZeilenNummer( "Überschrift" ) < 0 )
+            {
+                ret->addZeile( 0, "Überschrift" );
+                ret->setZeilenHeight( 0, 20 );
+            }
+            TextFeld *tf = uiFactory.createTextFeld( uiFactory.initParam );
+            tf->setSize( i->breite, 20 );
+            tf->setText( i->name );
+            ret->setZeichnungZ( i->name, "Überschrift", tf );
+        }
+    }
+    return ret;
+}
+
+TextFeld *initTextFeld( UIInit &uiFactory, int style, char *txt )
+{
+    TextFeld *ret = uiFactory.createTextFeld( uiFactory.initParam );
+    ret->setStyle( style );
+    if( txt )
+        ret->setText( txt );
+    return ret;
+}
+
 // Inhalt der StatistikTabelle Klasse aus StatistikTabelle.h
 // Konstruktor
 StatistikTabelle::StatistikTabelle( Array< SSDGesamtSpieler * > *ssdgs, Array< SSDGesamtTeam * > *ssdgt,
-                                    Array< SSDRunde * > *ssdr, Schrift *zSchrift, Bildschirm *zScreen, bool historie )
-    : schrift( dynamic_cast<Schrift *>( zSchrift->getThis() ) ),
+                                    Array< SSDRunde * > *ssdr, UIInit &uiFactory, bool historie )
+    : ReferenceCounter(),
+    uiFactory( uiFactory ),
     ssdgs( ssdgs ),
     ssdgt( ssdgt ),
     ssdr( ssdr ),
-    stAuswahl( initAuswahlBox( 10, 10, 120, 20, zSchrift, ABSTYLE, { "Spieler", "Teams" } ) ),
-    grAuswahl( initAuswahlBox( 140, 10, 120, 20, zSchrift, ABSTYLE, { "Gesamt" } ) ),
-    sortAuswahlGS( initAuswahlBox( 270, 10, 120, 20, zSchrift, ABSTYLE, { "Spielername", "Teamname", "Spielerfarbe", "Teamfarbe",
+    stAuswahl( initAuswahlBox( 10, 10, 120, 20, uiFactory, ABSTYLE, { "Spieler", "Teams" } ) ),
+    grAuswahl( initAuswahlBox( 140, 10, 120, 20, uiFactory, ABSTYLE, { "Gesamt" } ) ),
+    sortAuswahlGS( initAuswahlBox( 270, 10, 120, 20, uiFactory, ABSTYLE, { "Spielername", "Teamname", "Spielerfarbe", "Teamfarbe",
                                                                           "Gewonnene Runden", "Punkte", "Linienlänge", "Zeit am Leben",
                                                                           "Zeit tod", "Kills", "Tode" } ) ),
-    sortAuswahlGT( initAuswahlBox( 270, 10, 120, 20, zSchrift, ABSTYLE, { "Teamname", "Teamfarbe", "Gewonnene Runden", "Punkte",
+    sortAuswahlGT( initAuswahlBox( 270, 10, 120, 20, uiFactory, ABSTYLE, { "Teamname", "Teamfarbe", "Gewonnene Runden", "Punkte",
                                                                           "Linienlänge", "Kills", "Tode" } ) ),
     sortAuswahlRS( new RCArray< AuswahlBox >() ),
     sortAuswahlRT( new RCArray< AuswahlBox >() ),
-    sortRichtungGS( initAuswahlBox( 400, 10, 120, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
-    sortRichtungGT( initAuswahlBox( 400, 10, 120, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    sortRichtungGS( initAuswahlBox( 400, 10, 120, 20, uiFactory, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    sortRichtungGT( initAuswahlBox( 400, 10, 120, 20, uiFactory, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
     sortRichtungRS( new RCArray< AuswahlBox >() ),
     sortRichtungRT( new RCArray< AuswahlBox >() ),
-    gesamtSpieler( initObjTabelle( 10, 40, 500, 245, zSchrift, OTSTYLE, { { "Spielername", 120, 20, 200 }, { "Teamname", 120, 20, 120 },
+    gesamtSpieler( initObjTabelle( 10, 40, 500, 245, uiFactory, OTSTYLE, { { "Spielername", 120, 20, 200 }, { "Teamname", 120, 20, 120 },
     { "Spielerfarbe", 100, 20, 100 }, { "Teamfarbe", 100, 20, 100 }, { "Gewonnene Runden", 130, 20, 130 }, { "Punkte", 50, 20, 50 },
     { "Linienlänge", 120, 20, 120 }, { "Zeit Am Leben", 120, 20, 120 }, { "Zeit tod", 60, 20, 60 }, { "Kills", 40, 20, 40 }, { "Tode", 40, 20, 40 } }, 20 ) ),
-    gesamtTeam( initObjTabelle( 10, 40, 500, 245, zSchrift, OTSTYLE, { { "Teamname", 120, 20, 120 }, { "Teamfarbe", 100, 20, 100 },
+    gesamtTeam( initObjTabelle( 10, 40, 500, 245, uiFactory, OTSTYLE, { { "Teamname", 120, 20, 120 }, { "Teamfarbe", 100, 20, 100 },
     { "Gewonnene Runden", 130, 20, 130 }, { "Punkte", 50, 20, 50 }, { "Linienlänge", 120, 20, 120 }, { "Kills", 40, 20, 40 }, { "Tode", 40, 20, 40 } }, 20 ) ),
     rundeSpieler( new RCArray< ObjTabelle >() ),
     rundeTeam( new RCArray< ObjTabelle >() ),
     teamS( 0 ),
     rundeAusw( -1 ),
-    rend( 0 ),
-    ref( 1 )
+    rend( 0 )
 {
     tabelleFüllen( gesamtSpieler );
     tabelleFüllen( gesamtTeam );
@@ -47,23 +154,23 @@ StatistikTabelle::StatistikTabelle( Array< SSDGesamtSpieler * > *ssdgs, Array< S
         Text rName( "Runde " );
         rName += ssdr->get( i )->rundenNummer + 1;
         grAuswahl->addEintrag( rName );
-        AuswahlBox *ab = initAuswahlBox( 270, 10, 120, 20, zSchrift, ABSTYLE, { "Spielername", "Teamname", "Spielerfarbe",
+        AuswahlBox *ab = initAuswahlBox( 270, 10, 120, 20, uiFactory, ABSTYLE, { "Spielername", "Teamname", "Spielerfarbe",
                                          "Teamfarbe", "Linienlänge", "Kills", "Todeszeit" } );
-        initToolTip( ab, "Spalte nach der sortiert werden soll.", schrift, zScreen );
+        ab->setToolTipText( "Spalte nach der sortiert werden soll.", uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
         sortAuswahlRS->add( ab );
-        ab = initAuswahlBox( 270, 10, 120, 20, zSchrift, ABSTYLE, { "Teamname", "Teamfarbe", "Ergebnis",
+        ab = initAuswahlBox( 270, 10, 120, 20, uiFactory, ABSTYLE, { "Teamname", "Teamfarbe", "Ergebnis",
                              "Linienlänge", "Kills", "Tode" } );
-        initToolTip( ab, "Spalte nach der sortiert werden soll.", schrift, zScreen );
+        ab->setToolTipText( "Spalte nach der sortiert werden soll.", uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
         sortAuswahlRT->add( ab );
-        ab = initAuswahlBox( 400, 10, 120, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } );
-        initToolTip( ab, "Richtung nach der sortiert werden soll.", schrift, zScreen );
+        ab = initAuswahlBox( 400, 10, 120, 20, uiFactory, ABSTYLE, { "Aufwärts", "Abwärts" } );
+        ab->setToolTipText( "Richtung nach der sortiert werden soll.", uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
         sortRichtungRS->add( ab );
-        ab = initAuswahlBox( 400, 10, 120, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } );
-        initToolTip( ab, "Richtung nach der sortiert werden soll.", schrift, zScreen );
+        ab = initAuswahlBox( 400, 10, 120, 20, uiFactory, ABSTYLE, { "Aufwärts", "Abwärts" } );
+        ab->setToolTipText( "Richtung nach der sortiert werden soll.", uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
         sortRichtungRT->add( ab );
-        rundeSpieler->add( initObjTabelle( 10, 40, 500, 245, zSchrift, OTSTYLE, { { "Spielername", 120, 20, 200 }, { "Teamname", 120, 20, 120 },
+        rundeSpieler->add( initObjTabelle( 10, 40, 500, 245, uiFactory, OTSTYLE, { { "Spielername", 120, 20, 200 }, { "Teamname", 120, 20, 120 },
         { "Spielerfarbe", 100, 20, 100 }, { "Teamfarbe", 100, 20, 100 }, { "Linienlänge", 120, 20, 120 }, { "Kills", 40, 20, 40 }, { "Todeszeit", 80, 20, 80 } }, 20 ) );
-        rundeTeam->add( initObjTabelle( 10, 40, 500, 245, zSchrift, OTSTYLE, { { "Teamname", 120, 20, 120 }, { "Teamfarbe", 100, 20, 100 },
+        rundeTeam->add( initObjTabelle( 10, 40, 500, 245, uiFactory, OTSTYLE, { { "Teamname", 120, 20, 120 }, { "Teamfarbe", 100, 20, 100 },
         { "Ergebnis", 80, 20, 80 }, { "Linienlänge", 120, 20, 120 }, { "Kills", 40, 20, 40 }, { "Tode", 40, 20, 40 } }, 20 ) );
         tabelleFüllen( rundeSpieler->z( i ) );
         tabelleFüllen( rundeTeam->z( i ) );
@@ -95,7 +202,6 @@ StatistikTabelle::~StatistikTabelle()
     anz = rundeTeam->getEintragAnzahl();
     for( int i = 0; i < anz; i++ )
         tabelleLehren( rundeTeam->z( i ), 1 );
-    schrift->release();
     ssdgs->release();
     ssdgt->release();
     ssdr->release();
@@ -227,27 +333,27 @@ void StatistikTabelle::tabelleF
             int i = reihenfolge.get( j );
             zT->addZeile( Text( "Spieler " ) += ssdgs->get( i )->spielerNummer );
             int zNum = zT->getZeilenNummer( Text( "Spieler " ) += ssdgs->get( i )->spielerNummer );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Spielername" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, ssdgs->get( i )->spielerName ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Teamname" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, ssdgs->get( i )->teamName ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Spielerfarbe" ), zNum, initTextFeld( 0, 0, 0, 0, 0, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Spielername" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, ssdgs->get( i )->spielerName ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Teamname" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, ssdgs->get( i )->teamName ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Spielerfarbe" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
             ( (TextFeld *)zT->zZeichnung( zT->getSpaltenNummer( "Spielerfarbe" ), zNum ) )->setHintergrundFarbe( ssdgs->get( i )->spielerFarbe );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Teamfarbe" ), zNum, initTextFeld( 0, 0, 0, 0, 0, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Teamfarbe" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
             ( (TextFeld *)zT->zZeichnung( zT->getSpaltenNummer( "Teamfarbe" ), zNum ) )->setHintergrundFarbe( ssdgs->get( i )->teamFarbe );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Gewonnene Runden" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->gewonneneRunden ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Punkte" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->punkte ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Linienlänge" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->linienLänge ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Gewonnene Runden" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgs->get( i )->gewonneneRunden ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Punkte" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgs->get( i )->punkte ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Linienlänge" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgs->get( i )->linienLänge ) );
             Text zeitAmLeben;
             zeitAmLeben += ssdgs->get( i )->zeitAmLeben / 60;
             zeitAmLeben += ":";
             zeitAmLeben += ssdgs->get( i )->zeitAmLeben % 60;
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Zeit Am Leben" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, zeitAmLeben ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Zeit Am Leben" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, zeitAmLeben ) );
             Text zeitTod;
             zeitTod += ssdgs->get( i )->zeitTod / 60;
             zeitTod += ":";
             zeitTod += ssdgs->get( i )->zeitTod % 60;
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Zeit tod" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, zeitTod ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Kills" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->kills ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Tode" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->tode ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Zeit tod" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, zeitTod ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Kills" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgs->get( i )->kills ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Tode" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgs->get( i )->tode ) );
         }
         return;
     }
@@ -329,14 +435,14 @@ void StatistikTabelle::tabelleF
             int i = reihenfolge.get( j );
             zT->addZeile( Text( "Team " ) += ssdgt->get( i )->teamNummer );
             int zNum = zT->getZeilenNummer( Text( "Team " ) += ssdgt->get( i )->teamNummer );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Teamname" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, ssdgt->get( i )->teamName ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Teamfarbe" ), zNum, initTextFeld( 0, 0, 0, 0, 0, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Teamname" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, ssdgt->get( i )->teamName ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Teamfarbe" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
             ( (TextFeld *)zT->zZeichnung( zT->getSpaltenNummer( "Teamfarbe" ), zNum ) )->setHintergrundFarbe( ssdgt->get( i )->teamFarbe );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Gewonnene Runden" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->gewonneneRunden ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Punkte" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->punkte ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Linienlänge" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->linienLänge ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Kills" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->kills ) );
-            zT->setZeichnungZ( zT->getSpaltenNummer( "Tode" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->tode ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Gewonnene Runden" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgt->get( i )->gewonneneRunden ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Punkte" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgt->get( i )->punkte ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Linienlänge" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgt->get( i )->linienLänge ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Kills" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgt->get( i )->kills ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Tode" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdgt->get( i )->tode ) );
         }
         return;
     }
@@ -426,19 +532,19 @@ void StatistikTabelle::tabelleF
                 int i = reihenfolge.get( j );
                 zT->addZeile( Text( "Spieler " ) += ssdrs->get( i )->spielerNummer );
                 int zNum = zT->getZeilenNummer( Text( "Spieler " ) += ssdrs->get( i )->spielerNummer );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Spielername" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, ssdrs->get( i )->spielerName ) );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Teamname" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, ssdrs->get( i )->teamName ) );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Spielerfarbe" ), zNum, initTextFeld( 0, 0, 0, 0, 0, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Spielername" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, ssdrs->get( i )->spielerName ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Teamname" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, ssdrs->get( i )->teamName ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Spielerfarbe" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
                 ( (TextFeld *)zT->zZeichnung( zT->getSpaltenNummer( "Spielerfarbe" ), zNum ) )->setHintergrundFarbe( ssdrs->get( i )->spielerFarbe );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Teamfarbe" ), zNum, initTextFeld( 0, 0, 0, 0, 0, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Teamfarbe" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
                 ( (TextFeld *)zT->zZeichnung( zT->getSpaltenNummer( "Teamfarbe" ), zNum ) )->setHintergrundFarbe( ssdrs->get( i )->teamFarbe );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Linienlänge" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdrs->get( i )->linienLänge ) );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Kills" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdrs->get( i )->kills ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Linienlänge" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdrs->get( i )->linienLänge ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Kills" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdrs->get( i )->kills ) );
                 Text todesZeit;
                 todesZeit += ssdrs->get( i )->todesZeit / 60;
                 todesZeit += ":";
                 todesZeit += ssdrs->get( i )->todesZeit % 60;
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Todeszeit" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, todesZeit ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Todeszeit" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, todesZeit ) );
             }
             return;
         }
@@ -523,13 +629,13 @@ void StatistikTabelle::tabelleF
                 int i = reihenfolge.get( j );
                 zT->addZeile( Text( "Team " ) += ssdrt->get( i )->teamNummer );
                 int zNum = zT->getZeilenNummer( Text( "Team " ) += ssdrt->get( i )->teamNummer );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Teamname" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, ssdrt->get( i )->teamName ) );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Teamfarbe" ), zNum, initTextFeld( 0, 0, 0, 0, 0, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Teamname" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, ssdrt->get( i )->teamName ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Teamfarbe" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Sichtbar | TextFeld::Style::Hintergrund, 0 ) );
                 ( (TextFeld *)zT->zZeichnung( zT->getSpaltenNummer( "Teamfarbe" ), zNum ) )->setHintergrundFarbe( ssdrt->get( i )->teamFarbe );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Ergebnis" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, ergebnis ? Text( "Gewonnen" ) : Text( "Verloren" ) ) );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Linienlänge" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdrt->get( i )->linienLänge ) );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Kills" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdrt->get( i )->kills ) );
-                zT->setZeichnungZ( zT->getSpaltenNummer( "Tode" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdrt->get( i )->tode ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Ergebnis" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, ergebnis ? Text( "Gewonnen" ) : Text( "Verloren" ) ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Linienlänge" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdrt->get( i )->linienLänge ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Kills" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdrt->get( i )->kills ) );
+                zT->setZeichnungZ( zT->getSpaltenNummer( "Tode" ), zNum, initTextFeld( uiFactory, TextFeld::Style::Text, Text() += ssdrt->get( i )->tode ) );
             }
             return;
         }
@@ -753,19 +859,4 @@ void StatistikTabelle::render( Bild &zRObj )
 int StatistikTabelle::getRunde() const
 {
     return rundeAusw;
-}
-
-// Reference Counting
-StatistikTabelle *StatistikTabelle::getThis()
-{
-    ref++;
-    return this;
-}
-
-StatistikTabelle *StatistikTabelle::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 36 - 39
Linie/SpielStatistik/Tabelle/StatistikTabelle.h

@@ -3,53 +3,50 @@
 
 #include <Tabelle.h>
 #include <AuswahlBox.h>
+#include <UIInitialization.h>
 #include "../SpielStatistikDaten.h"
 
 using namespace Framework;
 
-class StatistikTabelle
+class StatistikTabelle : public virtual ReferenceCounter
 {
 private:
-	Schrift *schrift;
-	Array< SSDGesamtSpieler* > *ssdgs;
-	Array< SSDGesamtTeam* > *ssdgt;
-	Array< SSDRunde* > *ssdr;
-	AuswahlBox *stAuswahl;
-	AuswahlBox *grAuswahl;
-	AuswahlBox *sortAuswahlGS;
-	AuswahlBox *sortAuswahlGT;
-	RCArray< AuswahlBox > *sortAuswahlRS;
-	RCArray< AuswahlBox > *sortAuswahlRT;
-	AuswahlBox *sortRichtungGS;
-	AuswahlBox *sortRichtungGT;
-	RCArray< AuswahlBox > *sortRichtungRS;
-	RCArray< AuswahlBox > *sortRichtungRT;
-	ObjTabelle *gesamtSpieler;
-	ObjTabelle *gesamtTeam;
-	RCArray< ObjTabelle > *rundeSpieler;
-	RCArray< ObjTabelle > *rundeTeam;
-	bool teamS;
-	int rundeAusw;
-	bool rend;
-	int ref;
-	// privat
-	void tabelleLehren( ObjTabelle *zT, bool überschrift );
-	void tabelleFüllen( ObjTabelle *zT );
+    UIInit uiFactory;
+    Array< SSDGesamtSpieler * > *ssdgs;
+    Array< SSDGesamtTeam * > *ssdgt;
+    Array< SSDRunde * > *ssdr;
+    AuswahlBox *stAuswahl;
+    AuswahlBox *grAuswahl;
+    AuswahlBox *sortAuswahlGS;
+    AuswahlBox *sortAuswahlGT;
+    RCArray< AuswahlBox > *sortAuswahlRS;
+    RCArray< AuswahlBox > *sortAuswahlRT;
+    AuswahlBox *sortRichtungGS;
+    AuswahlBox *sortRichtungGT;
+    RCArray< AuswahlBox > *sortRichtungRS;
+    RCArray< AuswahlBox > *sortRichtungRT;
+    ObjTabelle *gesamtSpieler;
+    ObjTabelle *gesamtTeam;
+    RCArray< ObjTabelle > *rundeSpieler;
+    RCArray< ObjTabelle > *rundeTeam;
+    bool teamS;
+    int rundeAusw;
+    bool rend;
+    // privat
+    void tabelleLehren( ObjTabelle *zT, bool überschrift );
+    void tabelleFüllen( ObjTabelle *zT );
 
 public:
-	// Konstruktor
-	StatistikTabelle( Array< SSDGesamtSpieler* > *ssdgs, Array< SSDGesamtTeam* > *ssdgt, Array< SSDRunde* > *ssdr, Schrift *zSchrift, Bildschirm *zScreen, bool historie = 0 );
-	// Destruktor
-	~StatistikTabelle();
-	// nicht constant
-	void doPublicMausEreignis( MausEreignis &me );
-	bool tick( double tickVal );
-	void render( Bild &zRObj );
-	// constant
-	int getRunde() const;
-	// Reference Counting
-	StatistikTabelle *getThis();
-	StatistikTabelle *release();
+    // Konstruktor
+    StatistikTabelle( Array< SSDGesamtSpieler * > *ssdgs, Array< SSDGesamtTeam * > *ssdgt, Array< SSDRunde * > *ssdr, UIInit &uiFactory, bool historie = 0 );
+    // Destruktor
+    ~StatistikTabelle();
+    // nicht constant
+    void doPublicMausEreignis( MausEreignis &me );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    // constant
+    int getRunde() const;
 };
 
 #endif