Kolja Strohm 4 роки тому
батько
коміт
ed6723c38d

+ 2 - 1
StickmanWorldOnline/DLLStart.cpp

@@ -31,6 +31,7 @@ extern "C"
 
 	__declspec( dllexport ) EditorV *getEditor()
 	{
-		return new Editor::AsteroidsEditor();
+        return 0;
+		//return new Editor::SMWEditor();
 	}
 }

+ 3 - 3
StickmanWorldOnline/Editor.h

@@ -10,7 +10,7 @@
 
 namespace Editor
 {
-    class AsteroidsEditor : public EditorV
+    class SMWEditor : public EditorV
     {
     private:
         enum Status
@@ -44,9 +44,9 @@ namespace Editor
 
     public:
         // Konstruktor
-        AsteroidsEditor();
+        SMWEditor();
         // Destruktor
-        ~AsteroidsEditor();
+        ~SMWEditor();
         // nicht constant
         void addDialog( Dialog *d );
         void setSchrift( Schrift *schrift ) override;

+ 1 - 1
StickmanWorldOnline/Spiel.cpp

@@ -726,7 +726,7 @@ void Spiel::render( Bild &zRObj )
         return;
     if( zRObj.setDrawOptions( 300, 0, zRObj.getBreite() - 300, zRObj.getHeight() ) )
     {
-        zRObj.addScrollOffset( i->getX() - ( zRObj.getBreite() - 300 ) / 2, i->getY() - zRObj.getHeight() / 2 );
+        zRObj.addScrollOffset( (int)i->getX() - ( zRObj.getBreite() - 300 ) / 2, (int)i->getY() - zRObj.getHeight() / 2 );
         for( auto f = feuer.getIterator(); f; f++ )
             f->render( zRObj );
         for( auto s = schalter.getIterator(); s; s++ )

+ 359 - 0
StickmanWorldOnline/SpielStatistik.cpp

@@ -0,0 +1,359 @@
+#include "SpielStatistik.h"
+
+SpielStatistik::SpielStatistik()
+{
+    InitializeCriticalSection( &cs );
+    addNachrichtF = 0;
+    addChatF = 0;
+    addFreundF = 0;
+    accountAnsehenF = 0;
+    istFreundF = 0;
+    nachrichtParam = 0;
+    bilder = 0;
+    schrift = 0;
+    screen = 0;
+    infoc = 0;
+    spielc = 0;
+    status = 0;
+    gss = new Array< SSDSpieler * >();
+    gts = new Array< SSDTeam * >();
+    chat = 0;
+    tabelle = 0;
+    accountId = 0;
+    rend = 0;
+    ref = 1;
+}
+
+SpielStatistik::~SpielStatistik()
+{
+    if( chat )
+        chat->release();
+    if( tabelle )
+        tabelle->release();
+    if( schrift )
+        schrift->release();
+    if( infoc )
+        infoc->release();
+    if( spielc )
+        spielc->release();
+    int anz = gss->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( gss->hat( i ) )
+            delete gss->get( i );
+    }
+    gss->release();
+    anz = gts->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( gts->hat( i ) )
+            delete gts->get( i );
+    }
+    gts->release();
+    DeleteCriticalSection( &cs );
+}
+
+void SpielStatistik::lock()
+{
+    EnterCriticalSection( &cs );
+}
+
+void SpielStatistik::unlock()
+{
+    LeaveCriticalSection( &cs );
+}
+
+void SpielStatistik::bereit()
+{
+    char byte = 0;
+    spielc->statistikNachricht( 1, &byte );
+}
+
+void SpielStatistik::setBilder( BilderV *b )
+{
+    bilder = b;
+}
+
+void SpielStatistik::setAccountId( int id )
+{
+    accountId = id;
+}
+
+void SpielStatistik::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 )
+{
+    this->addNachrichtF = addNachrichtF;
+    this->addChatF = addChatF;
+    this->addFreundF = addFreundF;
+    this->accountAnsehenF = accountAnsehenF;
+    this->istFreundF = istFreundF;
+    this->nachrichtParam = nachrichtParam;
+}
+
+void SpielStatistik::setSchrift( Schrift *schrift )
+{
+    if( this->schrift )
+        this->schrift->release();
+    this->schrift = schrift;
+}
+
+void SpielStatistik::setBildschirm( Bildschirm *zScreen )
+{
+    screen = zScreen;
+}
+
+void SpielStatistik::setKlients( KSGClient::InformationServerClient *infoc, KSGClient::SpielServerClient *spielc )
+{
+    if( this->infoc )
+        this->infoc->release();
+    if( this->spielc )
+        this->spielc->release();
+    this->infoc = infoc;
+    this->spielc = spielc;
+}
+
+void SpielStatistik::nachricht( int län, char *bytes )
+{
+    lock();
+    char num = *bytes;
+    bytes++;
+    län--;
+    switch( num )
+    {
+    case 0: // Spieler Statistik
+        if( 1 )
+        {
+            SSDSpieler *ssdgs = new SSDSpieler();
+            ssdgs->spielerNummer = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            char snlän = *bytes;
+            län--;
+            bytes++;
+            char *txt = new char[ snlän + 1 ];
+            txt[ snlän ] = 0;
+            for( int i = 0; i < snlän; i++ )
+                txt[ i ] = bytes[ i ];
+            bytes += snlän;
+            län -= snlän;
+            ssdgs->spielerName = txt;
+            delete[] txt;
+            char tnlän = *bytes;
+            län--;
+            bytes++;
+            txt = new char[ tnlän + 1 ];
+            txt[ tnlän ] = 0;
+            for( int i = 0; i < tnlän; i++ )
+                txt[ i ] = bytes[ i ];
+            bytes += tnlän;
+            län -= tnlän;
+            ssdgs->teamName = txt;
+            delete[] txt;
+            ssdgs->spielerFarbe = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->teamFarbe = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->schadenBekommen = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->schadenGemacht = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->lebenGeheilt = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->schüsse = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->treffer = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->punkte = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->kills = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->tode = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->itemsAufgehoben = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgs->itemsVerwendet = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            gss->add( ssdgs );
+        }
+        break;
+    case 1: // Team Statistik
+        if( 1 )
+        {
+            SSDTeam *ssdgt = new SSDTeam();
+            ssdgt->teamNummer = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            char tnlän = *bytes;
+            län--;
+            bytes++;
+            char *txt = new char[ tnlän + 1 ];
+            txt[ tnlän ] = 0;
+            for( int i = 0; i < tnlän; i++ )
+                txt[ i ] = bytes[ i ];
+            bytes += tnlän;
+            län -= tnlän;
+            ssdgt->teamName = txt;
+            delete[] txt;
+            ssdgt->teamFarbe = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgt->punkte = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgt->kills = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            ssdgt->tode = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            gts->add( ssdgt );
+        }
+        break;
+    case 2: // Ladevorgang abgeschlossen
+        if( 1 )
+        {
+            chat = new StatistikChat( accountId, spielc->getThis(), infoc->getThis(), schrift->getThis(), bilder, addNachrichtF, addChatF, addFreundF, accountAnsehenF, nachrichtParam );
+            int anz = gss->getEintragAnzahl();
+            for( int i = 0; i < anz; i++ )
+            {
+                if( gss->hat( i ) )
+                {
+                    int acc = infoc->getAccountId( gss->get( i )->spielerName );
+                    if( acc )
+                        chat->addSpieler( acc, istFreundF( nachrichtParam, acc ) || acc == accountId );
+                }
+            }
+            tabelle = new StatistikTabelle( gss->getThis(), gts->getThis(), schrift, screen );
+            status = 1;
+        }
+        break;
+    case 3: // Chat Nachricht
+        if( 1 )
+        {
+            int vonAccount = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            char *txt = new char[ (__int64)län + 1 ];
+            txt[ län ] = 0;
+            for( int i = 0; i < län; i++ )
+                txt[ i ] = bytes[ i ];
+            if( status == 1 )
+                chat->addChatNachricht( vonAccount, txt );
+            delete[] txt;
+        }
+        break;
+    case 4: // Spieler hat verlassen
+        if( 1 )
+        {
+            int acc = *(int *)bytes;
+            bytes += 4;
+            län -= 4;
+            if( status == 1 )
+                chat->spielerOffline( acc );
+        }
+        break;
+    default:
+        // Fehler
+        break;
+    }
+    if( län != 0 )
+    {
+        // Fehler
+    }
+    unlock();
+}
+
+void SpielStatistik::doPublicMausEreignis( MausEreignis &me )
+{
+    if( !status )
+        return;
+    lock();
+    if( status == 1 )
+    {
+        tabelle->doPublicMausEreignis( me );
+        chat->doPublicMausEreignis( me );
+    }
+    unlock();
+}
+
+void SpielStatistik::doTastaturEreignis( TastaturEreignis &te )
+{
+    if( !status )
+        return;
+    lock();
+    if( status == 1 )
+        chat->doTastaturEreignis( te );
+    unlock();
+}
+
+bool SpielStatistik::tick( double zeit )
+{
+    if( !status )
+        return 0;
+    lock();
+    if( status == 1 )
+    {
+        rend |= chat->tick( zeit );
+        rend |= tabelle->tick( zeit );
+        if( chat->hatVerlassen() && status == 1 )
+        {
+            spielc->trenne();
+            status = 2;
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    unlock();
+    return ret;
+}
+
+void SpielStatistik::render( Bild &zRObj )
+{
+    if( !status )
+        return;
+    lock();
+    chat->render( zRObj );
+    tabelle->render( zRObj );
+    unlock();
+}
+
+void SpielStatistik::verlassen()
+{
+    if( spielc )
+        spielc->trenne();
+    status = 2;
+}
+
+// constant
+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;
+}

+ 45 - 45
StickmanWorldOnline/SpielStatistik.h

@@ -9,55 +9,55 @@
 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;
+    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< SSDSpieler* > *gss;
-	Array< SSDTeam* > *gts;
-	StatistikChat *chat;
-	StatistikTabelle *tabelle;
-	int accountId;
-	bool rend;
-	int status;
-	int ref;
+    CRITICAL_SECTION cs;
+    Array< SSDSpieler * > *gss;
+    Array< SSDTeam * > *gts;
+    StatistikChat *chat;
+    StatistikTabelle *tabelle;
+    int accountId;
+    bool rend;
+    int status;
+    int ref;
 
 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();
+    void bereit() override;
+    void setBilder( BilderV *b ) override;
+    void setAccountId( int id ) override;
+    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 ) override;
+    void setSchrift( Schrift *schrift ) override;
+    void setBildschirm( Bildschirm *zScreen ) override;
+    void setKlients( KSGClient::InformationServerClient *infoc, KSGClient::SpielServerClient *spielc ) override;
+    void nachricht( int län, char *bytes ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    bool tick( double zeit ) override;
+    void render( Bild &zRObj ) override;
+    void verlassen() override;
+    // constant
+    int getStatus() const override; // 0 = laden, 1 = läuft, 2 = fortsetzen
+    // Reference Counting
+    SpielStatistikV *getThis() override;
+    SpielStatistikV *release() override;
 };
 
 #endif

+ 3 - 9
StickmanWorldOnline/SpielStatistikDaten.h

@@ -16,14 +16,14 @@ struct SSDSpieler
 	int teamFarbe;
 	int schadenBekommen;
 	int schadenGemacht;
-	int treibstoffVerbraucht;
+	int lebenGeheilt;
 	int schüsse;
 	int treffer;
 	int punkte;
 	int kills;
 	int tode;
-	int zeitAmLeben;
-	int zeitTod;
+	int itemsAufgehoben;
+	int itemsVerwendet;
 };
 
 struct SSDTeam
@@ -31,15 +31,9 @@ struct SSDTeam
 	int teamNummer;
 	Text teamName;
 	int teamFarbe;
-	int schadenBekommen;
-	int schadenGemacht;
-	int treibstoffVerbraucht;
-	int schüsse;
-	int treffer;
 	int punkte;
 	int kills;
 	int tode;
-	bool gewonnen;
 };
 
 #endif

+ 338 - 376
StickmanWorldOnline/StatistikTabelle.cpp

@@ -6,417 +6,379 @@
 
 // Inhalt der StatistikTabelle Klasse aus StatistikTabelle.h
 // Konstruktor
-StatistikTabelle::StatistikTabelle( Array< SSDSpieler* > *ssdgs, Array< SSDTeam* > *ssdgt,
-									Schrift *zSchrift, Bildschirm *zScreen, bool historie )
-									: schrift( zSchrift->getThis() ),
-									ssdgs( ssdgs ),
-									ssdgt( ssdgt ),
-									stAuswahl( initAuswahlBox( 10, 10, 120, 20, zSchrift, ABSTYLE, { "Spieler", "Teams" } ) ),
-									sortAuswahlGS( initAuswahlBox( 270, 10, 120, 20, zSchrift, ABSTYLE, { "Spielername", "Teamname",
-									"Spielerfarbe", "Teamfarbe", "Schaden bekommen", "Schaden gemacht", "Treibstoff verbraucht",
-									"Präzision", "Punkte", "Kills", "Tode", "Zeit am Leben", "Zeit tod" } ) ),
-									sortAuswahlGT( initAuswahlBox( 270, 10, 120, 20, zSchrift, ABSTYLE, { "Teamname", "Teamfarbe",
-									"Schaden bekommen", "Schaden gemacht", "Treibstoff verbraucht", "Präzision", "Punkte", "Kills", "Tode" } ) ),
-									sortRichtungGS( initAuswahlBox( 400, 10, 120, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
-									sortRichtungGT( initAuswahlBox( 400, 10, 120, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
-									gesamtSpieler( initObjTabelle( 10, 40, 760, 245, zSchrift, OTSTYLE, { { "Spielername", 120, 20, 200 },
-									{ "Teamname", 120, 20, 120 }, { "Spielerfarbe", 100, 20, 100 }, { "Teamfarbe", 100, 20, 100 },
-									{ "Schaden bekommen", 130, 20, 130 }, { "Schaden gemacht", 130, 20, 130 },
-									{ "Treibstoff verbraucht", 140, 20, 140 }, { "Präzision", 60, 20, 60 }, { "Punkte", 50, 20, 50 },
-									{ "Kills", 40, 20, 40 }, { "Tode", 40, 20, 40 }, { "Zeit Am Leben", 120, 20, 120 },
-									{ "Zeit tod", 60, 20, 60 } }, 20 ) ),
-									gesamtTeam( initObjTabelle( 10, 40, 760, 245, zSchrift, OTSTYLE, { { "Teamname", 120, 20, 120 },
-									{ "Teamfarbe", 100, 20, 100 }, { "Schaden bekommen", 130, 20, 130 }, { "Schaden gemacht", 130, 20, 130 },
-									{ "Treibstoff verbraucht", 140, 20, 140 }, { "Präzision", 60, 20, 60 }, { "Punkte", 50, 20, 50 },
-									{ "Kills", 40, 20, 40 }, { "Tode", 40, 20, 40 } }, 20 ) ),
-									teamS( 0 ),
-									rend( 0 ),
-									ref( 1 )
+StatistikTabelle::StatistikTabelle( Array< SSDSpieler * > *ssdgs, Array< SSDTeam * > *ssdgt,
+                                    Schrift *zSchrift, Bildschirm *zScreen, bool historie )
+    : schrift( zSchrift->getThis() ),
+    ssdgs( ssdgs ),
+    ssdgt( ssdgt ),
+    stAuswahl( initAuswahlBox( 10, 10, 120, 20, zSchrift, ABSTYLE, { "Spieler", "Teams" } ) ),
+    sortAuswahlGS( initAuswahlBox( 270, 10, 120, 20, zSchrift, ABSTYLE, { "Spielername", "Teamname",
+    "Spielerfarbe", "Teamfarbe", "Schaden bekommen", "Schaden gemacht", "Leben geheilt",
+    "Präzision", "Punkte", "Kills", "Tode", "Items aufgehoben", "Items benutzt" } ) ),
+    sortAuswahlGT( initAuswahlBox( 270, 10, 120, 20, zSchrift, ABSTYLE, { "Teamname", "Teamfarbe",
+    "Punkte", "Kills", "Tode" } ) ),
+    sortRichtungGS( initAuswahlBox( 400, 10, 120, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    sortRichtungGT( initAuswahlBox( 400, 10, 120, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    gesamtSpieler( initObjTabelle( 10, 40, 760, 245, zSchrift, OTSTYLE, { { "Spielername", 120, 20, 200 },
+    { "Teamname", 120, 20, 120 }, { "Spielerfarbe", 100, 20, 100 }, { "Teamfarbe", 100, 20, 100 },
+    { "Schaden bekommen", 130, 20, 130 }, { "Schaden gemacht", 130, 20, 130 },
+    { "Leben geheilt", 120, 20, 140 }, { "Präzision", 60, 20, 60 }, { "Punkte", 50, 20, 50 },
+    { "Kills", 40, 20, 40 }, { "Tode", 40, 20, 40 }, { "Items aufgehoben", 120, 20, 120 },
+    { "Items benutzt", 80, 20, 60 } }, 20 ) ),
+    gesamtTeam( initObjTabelle( 10, 40, 760, 245, zSchrift, OTSTYLE, { { "Teamname", 120, 20, 120 },
+    { "Teamfarbe", 100, 20, 100 }, { "Punkte", 50, 20, 50 }, { "Kills", 40, 20, 40 }, { "Tode", 40, 20, 40 } }, 20 ) ),
+    teamS( 0 ),
+    rend( 0 ),
+    ref( 1 )
 {
-	tabelleFüllen( gesamtSpieler );
-	tabelleFüllen( gesamtTeam );
-	if( historie )
-	{
-		sortRichtungGS->setSize( 110, 20 );
-		sortRichtungGT->setSize( 110, 20 );
-		gesamtSpieler->setSize( 760, 380 );
-		gesamtTeam->setSize( 760, 380 );
-	}
+    tabelleFüllen( gesamtSpieler );
+    tabelleFüllen( gesamtTeam );
+    if( historie )
+    {
+        sortRichtungGS->setSize( 110, 20 );
+        sortRichtungGT->setSize( 110, 20 );
+        gesamtSpieler->setSize( 760, 380 );
+        gesamtTeam->setSize( 760, 380 );
+    }
 }
 
 // Destruktor
 StatistikTabelle::~StatistikTabelle()
 {
-	schrift->release();
-	ssdgs->release();
-	ssdgt->release();
-	stAuswahl->release();
-	sortAuswahlGS->release();
-	sortAuswahlGT->release();
-	sortRichtungGS->release();
-	sortRichtungGT->release();
-	gesamtSpieler->release();
-	gesamtTeam->release();
+    schrift->release();
+    ssdgs->release();
+    ssdgt->release();
+    stAuswahl->release();
+    sortAuswahlGS->release();
+    sortAuswahlGT->release();
+    sortRichtungGS->release();
+    sortRichtungGT->release();
+    gesamtSpieler->release();
+    gesamtTeam->release();
 }
 
 // privat
 void StatistikTabelle::tabelleLehren( ObjTabelle *zT, bool überschrift )
 {
-	int zAnz = zT->getZeilenAnzahl();
-	for( int i = !überschrift; i < zAnz; i++ )
-		zT->removeZeile( !überschrift );
+    int zAnz = zT->getZeilenAnzahl();
+    for( int i = !überschrift; i < zAnz; i++ )
+        zT->removeZeile( !überschrift );
 }
 
 void StatistikTabelle::tabelleFüllen( ObjTabelle *zT )
 {
-	if( zT == gesamtSpieler )
-	{
-		if( !sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() ) )
-			return;
-		if( !sortRichtungGS->zEintragText( sortRichtungGS->getAuswahl() ) )
-			return;
-		Array< int > reihenfolge;
-		bool aufsteigend = sortRichtungGS->zEintragText( sortRichtungGS->getAuswahl() )->istGleich( "Aufwärts" );
-		int anz = ssdgs->getEintragAnzahl();
-		bool *fertig = new bool[ anz ];
-		ZeroMemory( fertig, anz );
-		bool spielername = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Spielername" );
-		bool teamname = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Teamname" );
-		bool spielerfarbe = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Spielerfarbe" );
-		bool teamfarbe = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Teamfarbe" );
-		bool schadenBekommen = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Schaden bekommen" );
-		bool schadenGemacht = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Schaden gemacht" );
-		bool treibstoffVerbraucht = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Treibstoff verbraucht" );
-		bool präzision = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Präzision" );
-		bool punkte = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Punkte" );
-		bool kills = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Kills" );
-		bool tode = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Tode" );
-		bool zeitamleben = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Zeit am Leben" );
-		bool zeittod = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Zeit tod" );
-		for( int i = 0; i < anz; i++ )
-		{
-			Text minMaxT;
-			int minMax;
-			int pos = -1;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( !ssdgs->hat( j ) || fertig[ j ] )
-					continue;
-				if( spielername && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->spielerName < minMaxT ) || ( !aufsteigend && ssdgs->get( j )->spielerName > minMaxT ) ) )
-				{ // Sortiert nach Spieler Name
-					minMaxT = ssdgs->get( j )->spielerName.getText();
-					pos = j;
-				}
-				if( teamname && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->teamName < minMaxT ) || ( !aufsteigend && ssdgs->get( j )->teamName > minMaxT ) ) )
-				{ // Sortiert nach Team Name
-					minMaxT = ssdgs->get( j )->teamName.getText();
-					pos = j;
-				}
-				if( spielerfarbe && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->spielerFarbe < minMax ) || ( !aufsteigend && ssdgs->get( j )->spielerFarbe > minMax ) ) )
-				{ // Sortiert nach Spieler Farbe
-					minMax = ssdgs->get( j )->spielerFarbe;
-					pos = j;
-				}
-				if( teamfarbe && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->teamFarbe < minMax ) || ( !aufsteigend && ssdgs->get( j )->teamFarbe > minMax ) ) )
-				{ // Sortiert nach Team Farbe
-					minMax = ssdgs->get( j )->teamFarbe;
-					pos = j;
-				}
-				if( schadenBekommen && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->schadenBekommen < minMax ) || ( !aufsteigend && ssdgs->get( j )->schadenBekommen > minMax ) ) )
-				{ // Sortiert nach Schaden bekommen
-					minMax = ssdgs->get( j )->schadenBekommen;
-					pos = j;
-				}
-				if( schadenGemacht && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->schadenGemacht < minMax ) || ( !aufsteigend && ssdgs->get( j )->schadenGemacht > minMax ) ) )
-				{ // Sortiert nach Schaden gemacht
-					minMax = ssdgs->get( j )->schadenGemacht;
-					pos = j;
-				}
-				if( treibstoffVerbraucht && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->treibstoffVerbraucht < minMax ) || ( !aufsteigend && ssdgs->get( j )->treibstoffVerbraucht > minMax ) ) )
-				{ // Sortiert nach Treibstoff verbraucht
-					minMax = ssdgs->get( j )->treibstoffVerbraucht;
-					pos = j;
-				}
-				if( präzision && ( pos < 0 || ( aufsteigend && ( ssdgs->get( j )->treffer ? (int)( 100 / ( (double)ssdgs->get( j )->schüsse / ssdgs->get( j )->treffer ) ) : 0 ) < minMax ) || ( !aufsteigend && ( 100 / ( ssdgs->get( j )->schüsse / ssdgs->get( j )->treffer ) ) > minMax ) ) )
-				{ // Sortiert nach Treibstoff verbraucht
-					minMax = (int)( 100 / ( (double)ssdgs->get( j )->schüsse / ssdgs->get( j )->treffer ) );
-					pos = j;
-				}
-				if( punkte && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->punkte < minMax ) || ( !aufsteigend && ssdgs->get( j )->punkte > minMax ) ) )
-				{ // Sortiert nach Punkten
-					minMax = ssdgs->get( j )->punkte;
-					pos = j;
-				}
-				if( kills && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->kills < minMax ) || ( !aufsteigend && ssdgs->get( j )->kills > minMax ) ) )
-				{ // Sortiert nach Kills
-					minMax = ssdgs->get( j )->kills;
-					pos = j;
-				}
-				if( tode && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->tode < minMax ) || ( !aufsteigend && ssdgs->get( j )->tode > minMax ) ) )
-				{ // Sortiert nach Toden
-					minMax = ssdgs->get( j )->tode;
-					pos = j;
-				}
-				if( zeitamleben && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->zeitAmLeben < minMax ) || ( !aufsteigend && ssdgs->get( j )->zeitAmLeben > minMax ) ) )
-				{ // Sortiert nach Zeit Am Leben
-					minMax = ssdgs->get( j )->zeitAmLeben;
-					pos = j;
-				}
-				if( zeittod && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->zeitTod < minMax ) || ( !aufsteigend && ssdgs->get( j )->zeitTod > minMax ) ) )
-				{ // Sortiert nach Zeit Tod
-					minMax = ssdgs->get( j )->zeitTod;
-					pos = j;
-				}
-			}
-			if( pos >= 0 )
-			{
-				reihenfolge.add( pos );
-				fertig[ pos ] = 1;
-			}
-			else
-				break;
-		}
-		delete[] fertig;
-		anz = reihenfolge.getEintragAnzahl();
-		for( int j = 0; j < anz; j++ )
-		{
-			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 ) );
-			( (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 ) );
-			( (TextFeld*)zT->zZeichnung( zT->getSpaltenNummer( "Teamfarbe" ), zNum ) )->setHintergrundFarbe( ssdgs->get( i )->teamFarbe );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Schaden bekommen" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->schadenBekommen ) );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Schaden gemacht" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->schadenGemacht ) );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Treibstoff verbraucht" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->treibstoffVerbraucht ) );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Präzision" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ( ssdgs->get( i )->schüsse ? ( 100 * ssdgs->get( i )->treffer / ssdgs->get( i )->schüsse ) : 0 ) ) );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Punkte" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->punkte ) );
-			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 ) );
-			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 ) );
-			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 ) );
-		}
-		return;
-	}
-	if( zT == gesamtTeam )
-	{
-		if( !sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() ) )
-			return;
-		if( !sortRichtungGS->zEintragText( sortRichtungGS->getAuswahl() ) )
-			return;
-		Array< int > reihenfolge;
-		bool aufsteigend = sortRichtungGT->zEintragText( sortRichtungGT->getAuswahl() )->istGleich( "Aufwärts" );
-		int anz = ssdgt->getEintragAnzahl();
-		bool *fertig = new bool[ anz ];
-		ZeroMemory( fertig, anz );
-		bool teamname = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Teamname" );
-		bool teamfarbe = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Teamfarbe" );
-		bool schadenBekommen = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Schaden bekommen" );
-		bool schadenGemacht = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Schaden gemacht" );
-		bool treibstoffVerbraucht = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Treibstoff verbraucht" );
-		bool präzision = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Präzision" );
-		bool punkte = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Punkte" );
-		bool kills = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Kills" );
-		bool tode = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Tode" );
-		for( int i = 0; i < anz; i++ )
-		{
-			Text minMaxT;
-			int minMax;
-			int pos = -1;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( !ssdgt->hat( j ) || fertig[ j ] )
-					continue;
-				if( teamname && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->teamName < minMaxT ) || ( !aufsteigend && ssdgt->get( j )->teamName > minMaxT ) ) )
-				{ // Sortiert nach Team Name
-					minMaxT = ssdgt->get( j )->teamName.getText();
-					pos = j;
-				}
-				if( teamfarbe && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->teamFarbe < minMax ) || ( !aufsteigend && ssdgt->get( j )->teamFarbe > minMax ) ) )
-				{ // Sortiert nach Team Farbe
-					minMax = ssdgt->get( j )->teamFarbe;
-					pos = j;
-				}
-				if( schadenBekommen && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->schadenBekommen < minMax ) || ( !aufsteigend && ssdgt->get( j )->schadenBekommen > minMax ) ) )
-				{ // Sortiert nach Schaden bekommen
-					minMax = ssdgt->get( j )->schadenBekommen;
-					pos = j;
-				}
-				if( schadenGemacht && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->schadenGemacht < minMax ) || ( !aufsteigend && ssdgt->get( j )->schadenGemacht > minMax ) ) )
-				{ // Sortiert nach Schaden gemacht
-					minMax = ssdgt->get( j )->schadenGemacht;
-					pos = j;
-				}
-				if( treibstoffVerbraucht && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->treibstoffVerbraucht < minMax ) || ( !aufsteigend && ssdgt->get( j )->treibstoffVerbraucht > minMax ) ) )
-				{ // Sortiert nach Linienlängen
-					minMax = ssdgt->get( j )->treibstoffVerbraucht;
-					pos = j;
-				}
-				if( präzision && ( pos < 0 || ( aufsteigend && ( ssdgt->get( j )->treffer ? (int)( 100 / ( (double)ssdgt->get( j )->schüsse / ssdgt->get( j )->treffer ) ) : 0 ) < minMax ) || ( !aufsteigend && ( 100 / ( ssdgt->get( j )->schüsse / ssdgt->get( j )->treffer ) ) > minMax ) ) )
-				{ // Sortiert nach Präzision
-					minMax = (int)( 100 / ( (double)ssdgt->get( j )->schüsse / ssdgt->get( j )->treffer ) );
-					pos = j;
-				}
-				if( punkte && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->punkte < minMax ) || ( !aufsteigend && ssdgt->get( j )->punkte > minMax ) ) )
-				{ // Sortiert nach Punkten
-					minMax = ssdgt->get( j )->punkte;
-					pos = j;
-				}
-				if( kills && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->kills < minMax ) || ( !aufsteigend && ssdgt->get( j )->kills > minMax ) ) )
-				{ // Sortiert nach Kills
-					minMax = ssdgt->get( j )->kills;
-					pos = j;
-				}
-				if( tode && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->tode < minMax ) || ( !aufsteigend && ssdgt->get( j )->tode > minMax ) ) )
-				{ // Sortiert nach Toden
-					minMax = ssdgt->get( j )->tode;
-					pos = j;
-				}
-			}
-			if( pos >= 0 )
-			{
-				reihenfolge.add( pos );
-				fertig[ pos ] = 1;
-			}
-			else
-				break;
-		}
-		delete[] fertig;
-		anz = reihenfolge.getEintragAnzahl();
-		for( int j = 0; j < anz; j++ )
-		{
-			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 ) );
-			( (TextFeld*)zT->zZeichnung( zT->getSpaltenNummer( "Teamfarbe" ), zNum ) )->setHintergrundFarbe( ssdgt->get( i )->teamFarbe );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Schaden bekommen" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->schadenBekommen ) );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Schaden gemacht" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->schadenGemacht ) );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Treibstoff verbraucht" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->treibstoffVerbraucht ) );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Präzision" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ( ssdgt->get( j )->treffer ? ( 100 / ( ssdgt->get( j )->schüsse / ssdgt->get( j )->treffer ) ) : 0 ) ) );
-			zT->setZeichnungZ( zT->getSpaltenNummer( "Punkte" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->punkte ) );
-			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 ) );
-		}
-		return;
-	}
+    if( zT == gesamtSpieler )
+    {
+        if( !sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() ) )
+            return;
+        if( !sortRichtungGS->zEintragText( sortRichtungGS->getAuswahl() ) )
+            return;
+        Array< int > reihenfolge;
+        bool aufsteigend = sortRichtungGS->zEintragText( sortRichtungGS->getAuswahl() )->istGleich( "Aufwärts" );
+        int anz = ssdgs->getEintragAnzahl();
+        bool *fertig = new bool[ anz ];
+        ZeroMemory( fertig, anz );
+        bool spielername = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Spielername" );
+        bool teamname = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Teamname" );
+        bool spielerfarbe = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Spielerfarbe" );
+        bool teamfarbe = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Teamfarbe" );
+        bool schadenBekommen = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Schaden bekommen" );
+        bool schadenGemacht = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Schaden gemacht" );
+        bool lebenGeheilt = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Leben geheilt" );
+        bool präzision = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Präzision" );
+        bool punkte = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Punkte" );
+        bool kills = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Kills" );
+        bool tode = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Tode" );
+        bool itemsAufgehoben = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Items aufgehoben" );
+        bool itemsBenutzt = sortAuswahlGS->zEintragText( sortAuswahlGS->getAuswahl() )->istGleich( "Items benutzt" );
+        for( int i = 0; i < anz; i++ )
+        {
+            Text minMaxT;
+            int minMax;
+            int pos = -1;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( !ssdgs->hat( j ) || fertig[ j ] )
+                    continue;
+                if( spielername && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->spielerName < minMaxT ) || ( !aufsteigend && ssdgs->get( j )->spielerName > minMaxT ) ) )
+                { // Sortiert nach Spieler Name
+                    minMaxT = ssdgs->get( j )->spielerName.getText();
+                    pos = j;
+                }
+                if( teamname && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->teamName < minMaxT ) || ( !aufsteigend && ssdgs->get( j )->teamName > minMaxT ) ) )
+                { // Sortiert nach Team Name
+                    minMaxT = ssdgs->get( j )->teamName.getText();
+                    pos = j;
+                }
+                if( spielerfarbe && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->spielerFarbe < minMax ) || ( !aufsteigend && ssdgs->get( j )->spielerFarbe > minMax ) ) )
+                { // Sortiert nach Spieler Farbe
+                    minMax = ssdgs->get( j )->spielerFarbe;
+                    pos = j;
+                }
+                if( teamfarbe && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->teamFarbe < minMax ) || ( !aufsteigend && ssdgs->get( j )->teamFarbe > minMax ) ) )
+                { // Sortiert nach Team Farbe
+                    minMax = ssdgs->get( j )->teamFarbe;
+                    pos = j;
+                }
+                if( schadenBekommen && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->schadenBekommen < minMax ) || ( !aufsteigend && ssdgs->get( j )->schadenBekommen > minMax ) ) )
+                { // Sortiert nach Schaden bekommen
+                    minMax = ssdgs->get( j )->schadenBekommen;
+                    pos = j;
+                }
+                if( schadenGemacht && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->schadenGemacht < minMax ) || ( !aufsteigend && ssdgs->get( j )->schadenGemacht > minMax ) ) )
+                { // Sortiert nach Schaden gemacht
+                    minMax = ssdgs->get( j )->schadenGemacht;
+                    pos = j;
+                }
+                if( lebenGeheilt && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->lebenGeheilt < minMax ) || ( !aufsteigend && ssdgs->get( j )->lebenGeheilt > minMax ) ) )
+                { // Sortiert nach Leben geheilt
+                    minMax = ssdgs->get( j )->lebenGeheilt;
+                    pos = j;
+                }
+                if( präzision && ( pos < 0 || ( aufsteigend && ( ssdgs->get( j )->treffer ? (int)( 100 / ( (double)ssdgs->get( j )->schüsse / ssdgs->get( j )->treffer ) ) : 0 ) < minMax ) || ( !aufsteigend && ( 100 / ( ssdgs->get( j )->schüsse / ssdgs->get( j )->treffer ) ) > minMax ) ) )
+                { // Sortiert nach Treibstoff verbraucht
+                    minMax = (int)( 100 / ( (double)ssdgs->get( j )->schüsse / ssdgs->get( j )->treffer ) );
+                    pos = j;
+                }
+                if( punkte && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->punkte < minMax ) || ( !aufsteigend && ssdgs->get( j )->punkte > minMax ) ) )
+                { // Sortiert nach Punkten
+                    minMax = ssdgs->get( j )->punkte;
+                    pos = j;
+                }
+                if( kills && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->kills < minMax ) || ( !aufsteigend && ssdgs->get( j )->kills > minMax ) ) )
+                { // Sortiert nach Kills
+                    minMax = ssdgs->get( j )->kills;
+                    pos = j;
+                }
+                if( tode && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->tode < minMax ) || ( !aufsteigend && ssdgs->get( j )->tode > minMax ) ) )
+                { // Sortiert nach Toden
+                    minMax = ssdgs->get( j )->tode;
+                    pos = j;
+                }
+                if( itemsAufgehoben && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->itemsAufgehoben < minMax ) || ( !aufsteigend && ssdgs->get( j )->itemsAufgehoben > minMax ) ) )
+                { // Sortiert nach Items aufgehoben
+                    minMax = ssdgs->get( j )->itemsAufgehoben;
+                    pos = j;
+                }
+                if( itemsBenutzt && ( pos < 0 || ( aufsteigend && ssdgs->get( j )->itemsVerwendet < minMax ) || ( !aufsteigend && ssdgs->get( j )->itemsVerwendet > minMax ) ) )
+                { // Sortiert nach Items benutzt
+                    minMax = ssdgs->get( j )->itemsVerwendet;
+                    pos = j;
+                }
+            }
+            if( pos >= 0 )
+            {
+                reihenfolge.add( pos );
+                fertig[ pos ] = 1;
+            }
+            else
+                break;
+        }
+        delete[] fertig;
+        anz = reihenfolge.getEintragAnzahl();
+        for( int j = 0; j < anz; j++ )
+        {
+            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 ) );
+            ( (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 ) );
+            ( (TextFeld *)zT->zZeichnung( zT->getSpaltenNummer( "Teamfarbe" ), zNum ) )->setHintergrundFarbe( ssdgs->get( i )->teamFarbe );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Schaden bekommen" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->schadenBekommen ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Schaden gemacht" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->schadenGemacht ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Leben geheilt" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->lebenGeheilt ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Präzision" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ( ssdgs->get( i )->schüsse ? ( 100 * ssdgs->get( i )->treffer / ssdgs->get( i )->schüsse ) : 0 ) ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Punkte" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgs->get( i )->punkte ) );
+            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( "Items aufgehoben" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text( ssdgs->get( i )->itemsAufgehoben ) ) );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Items benutzt" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text( ssdgs->get( i )->itemsVerwendet ) ) );
+        }
+        return;
+    }
+    if( zT == gesamtTeam )
+    {
+        if( !sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() ) )
+            return;
+        if( !sortRichtungGS->zEintragText( sortRichtungGS->getAuswahl() ) )
+            return;
+        Array< int > reihenfolge;
+        bool aufsteigend = sortRichtungGT->zEintragText( sortRichtungGT->getAuswahl() )->istGleich( "Aufwärts" );
+        int anz = ssdgt->getEintragAnzahl();
+        bool *fertig = new bool[ anz ];
+        ZeroMemory( fertig, anz );
+        bool teamname = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Teamname" );
+        bool teamfarbe = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Teamfarbe" );
+        bool punkte = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Punkte" );
+        bool kills = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Kills" );
+        bool tode = sortAuswahlGT->zEintragText( sortAuswahlGT->getAuswahl() )->istGleich( "Tode" );
+        for( int i = 0; i < anz; i++ )
+        {
+            Text minMaxT;
+            int minMax;
+            int pos = -1;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( !ssdgt->hat( j ) || fertig[ j ] )
+                    continue;
+                if( teamname && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->teamName < minMaxT ) || ( !aufsteigend && ssdgt->get( j )->teamName > minMaxT ) ) )
+                { // Sortiert nach Team Name
+                    minMaxT = ssdgt->get( j )->teamName.getText();
+                    pos = j;
+                }
+                if( teamfarbe && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->teamFarbe < minMax ) || ( !aufsteigend && ssdgt->get( j )->teamFarbe > minMax ) ) )
+                { // Sortiert nach Team Farbe
+                    minMax = ssdgt->get( j )->teamFarbe;
+                    pos = j;
+                }
+                if( punkte && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->punkte < minMax ) || ( !aufsteigend && ssdgt->get( j )->punkte > minMax ) ) )
+                { // Sortiert nach Punkten
+                    minMax = ssdgt->get( j )->punkte;
+                    pos = j;
+                }
+                if( kills && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->kills < minMax ) || ( !aufsteigend && ssdgt->get( j )->kills > minMax ) ) )
+                { // Sortiert nach Kills
+                    minMax = ssdgt->get( j )->kills;
+                    pos = j;
+                }
+                if( tode && ( pos < 0 || ( aufsteigend && ssdgt->get( j )->tode < minMax ) || ( !aufsteigend && ssdgt->get( j )->tode > minMax ) ) )
+                { // Sortiert nach Toden
+                    minMax = ssdgt->get( j )->tode;
+                    pos = j;
+                }
+            }
+            if( pos >= 0 )
+            {
+                reihenfolge.add( pos );
+                fertig[ pos ] = 1;
+            }
+            else
+                break;
+        }
+        delete[] fertig;
+        anz = reihenfolge.getEintragAnzahl();
+        for( int j = 0; j < anz; j++ )
+        {
+            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 ) );
+            ( (TextFeld *)zT->zZeichnung( zT->getSpaltenNummer( "Teamfarbe" ), zNum ) )->setHintergrundFarbe( ssdgt->get( i )->teamFarbe );
+            zT->setZeichnungZ( zT->getSpaltenNummer( "Punkte" ), zNum, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, Text() += ssdgt->get( i )->punkte ) );
+            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 ) );
+        }
+        return;
+    }
 }
 
 // nicht constant
 void StatistikTabelle::doPublicMausEreignis( MausEreignis &me )
 {
-	// Auswahl Boxen
-	int ausw = stAuswahl->getAuswahl();
-	stAuswahl->doPublicMausEreignis( me );
-	if( ausw != stAuswahl->getAuswahl() )
-	{
-		teamS = stAuswahl->zEintragText( stAuswahl->getAuswahl() )->istGleich( "Teams" );
-		stAuswahl->einklappen();
-	}
-	if( teamS )
-	{ // Team Statistik
-		int ausw = sortAuswahlGT->getAuswahl();
-		sortAuswahlGT->doPublicMausEreignis( me );
-		if( ausw != sortAuswahlGT->getAuswahl() )
-		{ // Sortierungs Spalte ändert sich
-			tabelleLehren( gesamtTeam, 0 );
-			tabelleFüllen( gesamtTeam );
-			sortAuswahlGT->einklappen();
-		}
-		ausw = sortRichtungGT->getAuswahl();
-		sortRichtungGT->doPublicMausEreignis( me );
-		if( ausw != sortRichtungGT->getAuswahl() )
-		{ // Sortierungs Richtung ändert sich
-			tabelleLehren( gesamtTeam, 0 );
-			tabelleFüllen( gesamtTeam );
-			sortRichtungGT->einklappen();
-		}
-		gesamtTeam->doPublicMausEreignis( me );
-	}
-	else
-	{ // Spieler Statistik
-		int ausw = sortAuswahlGS->getAuswahl();
-		sortAuswahlGS->doPublicMausEreignis( me );
-		if( ausw != sortAuswahlGS->getAuswahl() )
-		{ // Sortierungs Spalte ändert sich
-			tabelleLehren( gesamtSpieler, 0 );
-			tabelleFüllen( gesamtSpieler );
-			sortAuswahlGS->einklappen();
-		}
-		ausw = sortRichtungGS->getAuswahl();
-		sortRichtungGS->doPublicMausEreignis( me );
-		if( ausw != sortRichtungGS->getAuswahl() )
-		{ // Sortierungs Richtung ändert sich
-			tabelleLehren( gesamtSpieler, 0 );
-			tabelleFüllen( gesamtSpieler );
-			sortRichtungGS->einklappen();
-		}
-		gesamtSpieler->doPublicMausEreignis( me );
-	}
+    // Auswahl Boxen
+    int ausw = stAuswahl->getAuswahl();
+    stAuswahl->doPublicMausEreignis( me );
+    if( ausw != stAuswahl->getAuswahl() )
+    {
+        teamS = stAuswahl->zEintragText( stAuswahl->getAuswahl() )->istGleich( "Teams" );
+        stAuswahl->einklappen();
+    }
+    if( teamS )
+    { // Team Statistik
+        int ausw = sortAuswahlGT->getAuswahl();
+        sortAuswahlGT->doPublicMausEreignis( me );
+        if( ausw != sortAuswahlGT->getAuswahl() )
+        { // Sortierungs Spalte ändert sich
+            tabelleLehren( gesamtTeam, 0 );
+            tabelleFüllen( gesamtTeam );
+            sortAuswahlGT->einklappen();
+        }
+        ausw = sortRichtungGT->getAuswahl();
+        sortRichtungGT->doPublicMausEreignis( me );
+        if( ausw != sortRichtungGT->getAuswahl() )
+        { // Sortierungs Richtung ändert sich
+            tabelleLehren( gesamtTeam, 0 );
+            tabelleFüllen( gesamtTeam );
+            sortRichtungGT->einklappen();
+        }
+        gesamtTeam->doPublicMausEreignis( me );
+    }
+    else
+    { // Spieler Statistik
+        int ausw = sortAuswahlGS->getAuswahl();
+        sortAuswahlGS->doPublicMausEreignis( me );
+        if( ausw != sortAuswahlGS->getAuswahl() )
+        { // Sortierungs Spalte ändert sich
+            tabelleLehren( gesamtSpieler, 0 );
+            tabelleFüllen( gesamtSpieler );
+            sortAuswahlGS->einklappen();
+        }
+        ausw = sortRichtungGS->getAuswahl();
+        sortRichtungGS->doPublicMausEreignis( me );
+        if( ausw != sortRichtungGS->getAuswahl() )
+        { // Sortierungs Richtung ändert sich
+            tabelleLehren( gesamtSpieler, 0 );
+            tabelleFüllen( gesamtSpieler );
+            sortRichtungGS->einklappen();
+        }
+        gesamtSpieler->doPublicMausEreignis( me );
+    }
 }
 
 bool StatistikTabelle::tick( double tickVal )
 {
-	if( teamS )
-	{ // Team Statistik
-		rend |= gesamtTeam->tick( tickVal );
-		rend |= sortAuswahlGT->tick( tickVal );
-		rend |= sortRichtungGT->tick( tickVal );
-	}
-	else
-	{ // Spieler Statistik
-		rend |= gesamtSpieler->tick( tickVal );
-		rend |= sortAuswahlGS->tick( tickVal );
-		rend |= sortRichtungGS->tick( tickVal );
-	}
-	// Auswahl Boxen
-	rend |= stAuswahl->tick( tickVal );
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    if( teamS )
+    { // Team Statistik
+        rend |= gesamtTeam->tick( tickVal );
+        rend |= sortAuswahlGT->tick( tickVal );
+        rend |= sortRichtungGT->tick( tickVal );
+    }
+    else
+    { // Spieler Statistik
+        rend |= gesamtSpieler->tick( tickVal );
+        rend |= sortAuswahlGS->tick( tickVal );
+        rend |= sortRichtungGS->tick( tickVal );
+    }
+    // Auswahl Boxen
+    rend |= stAuswahl->tick( tickVal );
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void StatistikTabelle::render( Bild &zRObj )
 {
-	if( teamS )
-	{ // Team Statistik
-		gesamtTeam->render( zRObj );
-		sortAuswahlGT->render( zRObj );
-		sortRichtungGT->render( zRObj );
-	}
-	else
-	{ // Spieler Statistik
-		gesamtSpieler->render( zRObj );
-		sortAuswahlGS->render( zRObj );
-		sortRichtungGS->render( zRObj );
-	}
-	// Auswahl Boxen
-	stAuswahl->render( zRObj );
+    if( teamS )
+    { // Team Statistik
+        gesamtTeam->render( zRObj );
+        sortAuswahlGT->render( zRObj );
+        sortRichtungGT->render( zRObj );
+    }
+    else
+    { // Spieler Statistik
+        gesamtSpieler->render( zRObj );
+        sortAuswahlGS->render( zRObj );
+        sortRichtungGS->render( zRObj );
+    }
+    // Auswahl Boxen
+    stAuswahl->render( zRObj );
 }
 
 // Reference Counting
 StatistikTabelle *StatistikTabelle::getThis()
 {
-	ref++;
-	return this;
+    ref++;
+    return this;
 }
 
 StatistikTabelle *StatistikTabelle::release()
 {
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
 }

+ 1 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj

@@ -49,6 +49,7 @@
     <ClCompile Include="SpielChat.cpp" />
     <ClCompile Include="Spieler.cpp" />
     <ClCompile Include="SpielerGUI.cpp" />
+    <ClCompile Include="SpielStatistik.cpp" />
     <ClCompile Include="StatistikChat.cpp" />
     <ClCompile Include="StatistikTabelle.cpp" />
     <ClCompile Include="STKNachricht.cpp" />

+ 3 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj.filters

@@ -152,6 +152,9 @@
     <ClCompile Include="SpielerGUI.cpp">
       <Filter>Spiel</Filter>
     </ClCompile>
+    <ClCompile Include="SpielStatistik.cpp">
+      <Filter>Statistik</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Aufzeichnung.h">