Prechádzať zdrojové kódy

use framework reference counter

Kolja Strohm 3 rokov pred
rodič
commit
da8b3cd70e

+ 13 - 13
StickmanWorldOnline/Aktionen.cpp

@@ -55,7 +55,7 @@ bool Aktion::runNext( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory,
             return 1;
         }
         if( result )
-            zMemory->setVar( zPC->getUniqueString() + "R" + i + "__", result->getThis() );
+            zMemory->setVar( zPC->getUniqueString() + "R" + i + "__", dynamic_cast<Variable *>( result->getThis() ) );
         zPC->count();
         if( waitCount > 0 )
         {
@@ -77,7 +77,7 @@ bool Aktion::runNext( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory,
 void Aktion::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {}
 
-void Aktion::writeOptions( Datei & dat )
+void Aktion::writeOptions( Datei &dat )
 {}
 
 AktionTyp Aktion::getTyp() const
@@ -338,7 +338,7 @@ bool TriggerAktion::runNext( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zM
                 zPC->stepOut();
                 return 1;
             }
-            zMemory->setVar( zPC->getUniqueString() + "R0__", t->getThis() );
+            zMemory->setVar( zPC->getUniqueString() + "R0__", dynamic_cast<Variable *>( t->getThis() ) );
             zPC->count();
         }
     }
@@ -453,7 +453,7 @@ SpielerGiveItem::SpielerGiveItem( RCArray< Aktion > *subActions )
 void SpielerGiveItem::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
     ( (Spieler *)zParam( 2 ) )->addItem( ( (GegenstandTypVar *)zParam( 0 ) )->getValue(),
-        ( (Integer *)zParam( 1 ) )->getValue(), zSpiel );
+                                         ( (Integer *)zParam( 1 ) )->getValue(), zSpiel );
 }
 
 
@@ -468,7 +468,7 @@ SpielerRemoveItem::SpielerRemoveItem( RCArray< Aktion > *subActions )
 void SpielerRemoveItem::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
     ( (Spieler *)zParam( 2 ) )->removeItem( ( (GegenstandTypVar *)zParam( 0 ) )->getValue(),
-        ( (Integer *)zParam( 1 ) )->getValue() );
+                                            ( (Integer *)zParam( 1 ) )->getValue() );
 }
 
 
@@ -866,7 +866,7 @@ TriggerRunStart::TriggerRunStart( RCArray< Aktion > *subActions )
 
 void TriggerRunStart::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
-    zSpiel->addTriggerRun( ( (Trigger *)zParam( 0 ) )->runTrigger( zEreignis->getThis(), zSpiel ) );
+    zSpiel->addTriggerRun( ( (Trigger *)zParam( 0 ) )->runTrigger( dynamic_cast<Ereignis *>( zEreignis->getThis() ), zSpiel ) );
 }
 
 
@@ -963,7 +963,7 @@ void GeschossNeu::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory,
                                 getRichtungFromString( ( (String *)zParam( 3 ) )->getValue() ),
                                 ( (Integer *)zParam( 0 ) )->getValue(),
                                 ( (Integer *)zParam( 1 ) )->getValue(), 0 );
-    zSpiel->addGeschoss( (Geschoss *)g->getThis() );
+    zSpiel->addGeschoss( dynamic_cast<Geschoss *>( g->getThis() ) );
     setReturn( g );
 }
 
@@ -1208,7 +1208,7 @@ void IntegerRechnen::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemo
 
 void IntegerRechnen::writeOptions( Datei &dat )
 {
-    dat.schreibe( (char*)&this->op, 1 );
+    dat.schreibe( (char *)&this->op, 1 );
 }
 
 
@@ -2908,7 +2908,7 @@ BestenlisteNeu::BestenlisteNeu( RCArray<Aktion> *subActions )
     : Aktion( BESTENLISTE_NEU, subActions )
 {}
 
-void BestenlisteNeu::run( Spiel * zSpiel, Ereignis * zEreignis, LocalMemory * zMemory, ProgramCounter * zPC, double &waitCount )
+void BestenlisteNeu::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
     setReturn( new Bestenliste( zSpiel->getNextId() ) );
 }
@@ -2921,7 +2921,7 @@ BestenlisteAddZeile::BestenlisteAddZeile( RCArray<Aktion> *subActions )
     erlaubteTypen.add( BESTENLISTE );
 }
 
-void BestenlisteAddZeile::run( Spiel * zSpiel, Ereignis * zEreignis, LocalMemory * zMemory, ProgramCounter * zPC, double &waitCount )
+void BestenlisteAddZeile::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
     ( (Bestenliste *)zParam( 1 ) )->addZeile( ( (String *)zParam( 0 ) )->getValue() );
 }
@@ -2934,7 +2934,7 @@ BestenlisteAddSpalte::BestenlisteAddSpalte( RCArray<Aktion> *subActions )
     erlaubteTypen.add( BESTENLISTE );
 }
 
-void BestenlisteAddSpalte::run( Spiel * zSpiel, Ereignis * zEreignis, LocalMemory * zMemory, ProgramCounter * zPC, double &waitCount )
+void BestenlisteAddSpalte::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
     ( (Bestenliste *)zParam( 1 ) )->addSpalte( ( (String *)zParam( 0 ) )->getValue() );
 }
@@ -2949,7 +2949,7 @@ BestenlisteSetWert::BestenlisteSetWert( RCArray<Aktion> *subActions )
     erlaubteTypen.add( BESTENLISTE );
 }
 
-void BestenlisteSetWert::run( Spiel * zSpiel, Ereignis * zEreignis, LocalMemory * zMemory, ProgramCounter * zPC, double &waitCount )
+void BestenlisteSetWert::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
     ( (Bestenliste *)zParam( 3 ) )->setWert( ( (String *)zParam( 0 ) )->getValue(), ( (String *)zParam( 1 ) )->getValue(), ( (String *)zParam( 2 ) )->getValue() );
 }
@@ -2963,7 +2963,7 @@ BestenlisteGetWert::BestenlisteGetWert( RCArray<Aktion> *subActions )
     erlaubteTypen.add( BESTENLISTE );
 }
 
-void BestenlisteGetWert::run( Spiel * zSpiel, Ereignis * zEreignis, LocalMemory * zMemory, ProgramCounter * zPC, double &waitCount )
+void BestenlisteGetWert::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
     setReturn( new String( ( (Bestenliste *)zParam( 2 ) )->getWert( ( (String *)zParam( 0 ) )->getValue(), ( (String *)zParam( 1 ) )->getValue() ) ) );
 }

+ 13 - 13
StickmanWorldOnline/Bariere.cpp

@@ -28,13 +28,13 @@ void Bariere::setStyle( int style, bool add, Spiel *zSpiel )
     if( add )
     {
         if( ( style | Style::Aktiv ) == style && ( this->style | Style::Aktiv ) != this->style )
-            zSpiel->setZuletztEingeschalteteBariere( (Bariere*)getThis() );
+            zSpiel->setZuletztEingeschalteteBariere( dynamic_cast<Bariere *>( getThis() ) );
         this->style |= style;
     }
     else
     {
         if( ( style | Style::Aktiv ) == style && ( this->style | Style::Aktiv ) == this->style )
-            zSpiel->setZuletztAusgeschalteteBariere( (Bariere *)getThis() );
+            zSpiel->setZuletztAusgeschalteteBariere( dynamic_cast<Bariere *>( getThis() ) );
         this->style &= ~style;
     }
 }
@@ -48,11 +48,11 @@ void Bariere::startAutoVerschiebung( Spiel *zSpiel )
 {
     if( !hatStyle( Style::AutoVerschiebung ) || hatStyle( Style::InVerschiebung ) )
         return;
-    zSpiel->setZuletztBewegteBariere( (Bariere *)getThis() );
+    zSpiel->setZuletztBewegteBariere( dynamic_cast<Bariere *>( getThis() ) );
     currentWeite = 0;
     setStyle( Style::InVerschiebung, 1, zSpiel );
     Ereignis *e = new Ereignis( BARIERE_WIRD_VERSCHOBEN );
-    e->addParameter( "Betroffene Bariere", getThis() );
+    e->addParameter( "Betroffene Bariere", dynamic_cast<Bariere *>( getThis() ) );
     e->addParameter( "Status", new String( "Start" ) );
     zSpiel->throwEvent( e );
 }
@@ -77,7 +77,7 @@ void Bariere::setTeam( Team *team )
     this->team = team;
 }
 
-void Bariere::tick( double time, Spiel* zSpiel)
+void Bariere::tick( double time, Spiel *zSpiel )
 {
     if( hatStyle( Style::InSchaltung ) )
     {
@@ -87,9 +87,9 @@ void Bariere::tick( double time, Spiel* zSpiel)
             setStyle( Style::InSchaltung, 0, zSpiel );
             setStyle( Style::Aktiv, !hatStyle( Style::Aktiv ), zSpiel );
             schaltungAnzahl++;
-			Ereignis* e = new Ereignis(BARIERE_SWITCHED);
-			e->addParameter("Betroffene Bariere", getThis());
-			zSpiel->throwEvent(e);
+            Ereignis *e = new Ereignis( BARIERE_SWITCHED );
+            e->addParameter( "Betroffene Bariere", dynamic_cast<Bariere *>( getThis() ) );
+            zSpiel->throwEvent( e );
         }
     }
     if( hatStyle( Style::InVerschiebung ) )
@@ -102,10 +102,10 @@ void Bariere::tick( double time, Spiel* zSpiel)
             setStyle( Style::InVerschiebung, 0, zSpiel );
             setStyle( Style::NextVerschiebungLinksOben, !hatStyle( Style::NextVerschiebungLinksOben ), zSpiel );
             verschiebungAnzahl++;
-			Ereignis* e = new Ereignis(BARIERE_WIRD_VERSCHOBEN);
-			e->addParameter( "Betroffene Bariere", getThis() );
-			e->addParameter( "Status", new String( "Feritg" ) );
-			zSpiel->throwEvent(e);
+            Ereignis *e = new Ereignis( BARIERE_WIRD_VERSCHOBEN );
+            e->addParameter( "Betroffene Bariere", dynamic_cast<Bariere *>( getThis() ) );
+            e->addParameter( "Status", new String( "Feritg" ) );
+            zSpiel->throwEvent( e );
         }
         if( hatStyle( Style::VerschiebungWaagerecht ) )
         {
@@ -148,7 +148,7 @@ Team *Bariere::getTeam() const
 {
     if( !team )
         return 0;
-    return (Team*)team->getThis();
+    return dynamic_cast<Team *>( team->getThis() );
 }
 
 Team *Bariere::zTeam() const

+ 5 - 5
StickmanWorldOnline/Base.cpp

@@ -28,13 +28,13 @@ Base::~Base()
 void Base::setTeam( Team *team, Spiel *zSpiel )
 {
     Ereignis *e = new Ereignis( BASIS_BESITZERWECHSEL );
-    e->addParameter( "Betroffene Basis", getThis() );
-    e->addParameter( "Vorheriges Team", this->team ? this->team->getThis() : new Variable( NICHTS ) );
-    e->addParameter( "Nächstes Team", team ? team->getThis() : new Variable( NICHTS ) );
+    e->addParameter( "Betroffene Basis", dynamic_cast<Base *>( getThis() ) );
+    e->addParameter( "Vorheriges Team", this->team ? dynamic_cast<Team *>( this->team->getThis() ) : new Variable( NICHTS ) );
+    e->addParameter( "Nächstes Team", team ? dynamic_cast<Team *>( team->getThis() ) : new Variable( NICHTS ) );
     if( this->team )
         this->team->release();
     this->team = team;
-    zSpiel->setLastTeamChangedBase( (Base *)getThis() );
+    zSpiel->setLastTeamChangedBase( dynamic_cast<Base *>( getThis() ) );
     zSpiel->throwEvent( e );
 }
 
@@ -87,7 +87,7 @@ int Base::getId() const
 
 Team *Base::getTeam() const
 {
-    return team ? (Team *)team->getThis() : 0;
+    return team ? dynamic_cast<Team *>( team->getThis() ) : 0;
 }
 
 Team *Base::zTeam() const

+ 2 - 2
StickmanWorldOnline/Drop.cpp

@@ -52,7 +52,7 @@ void Drop::setTime( float time )
 
 void Drop::doDrop( Spiel *zSpiel )
 {
-    zSpiel->setLastDrop( (Drop *)getThis() );
+    zSpiel->setLastDrop( dynamic_cast<Drop *>( getThis() ) );
     nextDrop = (float)maxTime;
     for( int i = 0; i < numDrops; i++ )
     {
@@ -70,7 +70,7 @@ void Drop::doDrop( Spiel *zSpiel )
             zSpiel->addGegenstand( new Gegenstand( zSpiel->getNextId(), (GegenstandTyp)typ, x, y ) );
     }
     Ereignis *e = new Ereignis( DROP_AKTION );
-    e->addParameter( "Betroffener Drop", getThis() );
+    e->addParameter( "Betroffener Drop", dynamic_cast<Drop *>( getThis() ) );
     zSpiel->throwEvent( e );
 }
 

+ 1 - 4
StickmanWorldOnline/ESEditorV.h

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

+ 12 - 38
StickmanWorldOnline/Editor.cpp

@@ -5,9 +5,8 @@
 // Inhalt der Editor Klasse aus Editor.h
 // Konstruktor
 Editor::Editor()
-{
-    ref = 1;
-}
+    : ReferenceCounter()
+{}
 
 // Destruktor
 Editor::~Editor()
@@ -314,8 +313,8 @@ bool Editor::nachricht( SKlient *k )
                 object.lese( (char *)&maxY, 4 );
                 object.lese( (char *)&maxTime, 4 );
                 object.lese( (char *)&numDrops, 4 );
-                for( int i = 0; i < ITEMANZAHL; i++ )
-                    object.lese( (char *)&wahrscheinlichkeit[ i ], 4 );
+                for( int j = 0; j < ITEMANZAHL; j++ )
+                    object.lese( (char *)&wahrscheinlichkeit[ j ], 4 );
                 object.lese( (char *)&len, 1 );
                 char *name = new char[ len ];
                 object.lese( name, len );
@@ -327,8 +326,8 @@ bool Editor::nachricht( SKlient *k )
                 k->sendeEncrypted( (char *)&maxY, 4 );
                 k->sendeEncrypted( (char *)&maxTime, 4 );
                 k->sendeEncrypted( (char *)&numDrops, 4 );
-                for( int i = 0; i < ITEMANZAHL; i++ )
-                    k->sendeEncrypted( (char *)&wahrscheinlichkeit[ i ], 4 );
+                for( int j = 0; j < ITEMANZAHL; j++ )
+                    k->sendeEncrypted( (char *)&wahrscheinlichkeit[ j ], 4 );
                 k->sendeEncrypted( (char *)&len, 1 );
                 k->sendeEncrypted( name, len );
                 delete[] name;
@@ -435,7 +434,7 @@ bool Editor::nachricht( SKlient *k )
         }
         return 1;
     }
-    case 0xB: // Lade Schiene Daten
+    case 0xB: // Lade Timer Daten
     {
         Text tmpPf = pfad.getText();
         tmpPf += "/timer";
@@ -631,7 +630,6 @@ bool Editor::nachricht( SKlient *k )
                 char buffer[ 2048 ];
                 int id = *files->z( i );
                 k->sendeEncrypted( (char *)&id, 4 );
-                k->sendeEncrypted( (char *)&size, 8 );
                 while( size > 0 )
                 {
                     object.lese( buffer, MIN( 2048, (int)size ) );
@@ -671,10 +669,9 @@ bool Editor::nachricht( SKlient *k )
                 __int64 size = object.getSize();
                 object.open( Datei::Style::lesen );
                 char buffer[ 2048 ];
-                unsigned char len = (unsigned char)(files->z( i )->getLength() - 2);
+                unsigned char len = (unsigned char)( files->z( i )->getLength() - 2 );
                 k->sendeEncrypted( (char *)&len, 1 );
                 k->sendeEncrypted( *files->z( i ), len );
-                k->sendeEncrypted( (char *)&size, 8 );
                 while( size > 0 )
                 {
                     object.lese( buffer, MIN( 2048, (int)size ) );
@@ -1183,15 +1180,7 @@ bool Editor::nachricht( SKlient *k )
         if( d.open( Datei::Style::schreiben ) )
         {
             k->sendeEncrypted( "\1", 1 );
-            __int64 size;
-            k->getNachrichtEncrypted( (char *)&size, 8 );
-            char buffer[ 2048 ];
-            while( size > 0 )
-            {
-                k->getNachrichtEncrypted( buffer, MIN( 2048, (int)size ) );
-                d.schreibe( buffer, MIN( 2048, (int)size ) );
-                size -= 2048;
-            }
+            // TODO
             d.close();
             k->sendeEncrypted( "\1", 1 );
             return 1;
@@ -1276,7 +1265,7 @@ bool Editor::nachricht( SKlient *k )
         if( d.open( Datei::Style::schreiben ) )
         {
             k->sendeEncrypted( "\1", 1 );
-            k->sendeEncrypted( (char*)&id, 4 );
+            k->sendeEncrypted( (char *)&id, 4 );
             int x;
             int y;
             int breite;
@@ -1330,7 +1319,7 @@ bool Editor::nachricht( SKlient *k )
         if( d.open( Datei::Style::schreiben ) )
         {
             k->sendeEncrypted( "\1", 1 );
-            k->sendeEncrypted( (char*)&id, 4 );
+            k->sendeEncrypted( (char *)&id, 4 );
             int x;
             int y;
             int breite;
@@ -1980,21 +1969,6 @@ char *Editor::getLetzterFehler() const
     return err;
 }
 
-// Reference Counting 
-ESEditorV *Editor::getThis()
-{
-    ref++;
-    return this;
-}
-
-ESEditorV *Editor::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // privat
 bool Editor::createSitzung()
 {
@@ -2979,7 +2953,7 @@ bool Editor::saveSitzung()
                 r.setDatei( tmp );
                 if( r.open( Datei::Style::lesen ) )
                 {
-                    unsigned char len = (unsigned char)(objPf->getLength() - 2);
+                    unsigned char len = (unsigned char)( objPf->getLength() - 2 );
                     d.schreibe( (char *)&len, 1 );
                     d.schreibe( objPf->getText(), len );
                     char typ;

+ 0 - 4
StickmanWorldOnline/Editor.h

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

+ 1 - 14
StickmanWorldOnline/Effect.cpp

@@ -2,10 +2,10 @@
 
 
 Effect::Effect( Spieler *zSpieler, float maxTime )
+    : ReferenceCounter()
 {
     this->zSpieler = zSpieler;
     timeLeft = maxTime;
-    ref = 1;
 }
 
 Effect::~Effect()
@@ -43,17 +43,4 @@ void Effect::move( Richtung r, double time )
 bool Effect::istGegenstandErlaubt( GegenstandTyp typ ) const
 {
     return 1;
-}
-
-Effect *Effect::getThis()
-{
-    ref++;
-    return this;
-}
-
-Effect *Effect::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 1 - 4
StickmanWorldOnline/Effect.h

@@ -6,12 +6,11 @@ class Spieler;
 class Spiel;
 class Team;
 
-class Effect
+class Effect : public virtual ReferenceCounter
 {
 protected:
     Spieler *zSpieler;
     float timeLeft;
-    int ref;
 
 public:
     Effect( Spieler *zSpieler, float maxTime );
@@ -23,6 +22,4 @@ public:
     virtual bool istIntersectable() const;
     virtual void move( Richtung r, double time );
     virtual bool istGegenstandErlaubt( GegenstandTyp typ ) const;
-    Effect *getThis();
-    Effect *release();
 };

+ 1 - 14
StickmanWorldOnline/Ereignis.cpp

@@ -2,9 +2,9 @@
 #include "Trigger.h"
 
 Ereignis::Ereignis( EreignisTyp typ )
+    : ReferenceCounter()
 {
     this->typ = typ;
-    ref = 1;
 }
 
 Ereignis::~Ereignis()
@@ -39,16 +39,3 @@ Variable *Ereignis::zParameter( const char *name ) const
     }
     return 0;
 }
-
-Ereignis *Ereignis::getThis()
-{
-    ref++;
-    return this;
-}
-
-Ereignis *Ereignis::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}

+ 1 - 4
StickmanWorldOnline/Ereignis.h

@@ -32,12 +32,11 @@ enum EreignisTyp
     UMLENKUNG_LENKT_UM // "Betroffes Geschoss", "Betroffe Umlenkung"
 };
 
-class Ereignis
+class Ereignis : public virtual ReferenceCounter
 {
 private:
     EreignisTyp typ;
     RCArray< VarPointer > params;
-    int ref;
 
 public:
     Ereignis( EreignisTyp typ );
@@ -46,6 +45,4 @@ public:
     void addParameter( const char *name, Variable *var );
     Variable *getParameter( const char *name ) const;
     Variable *zParameter( const char *name ) const;
-    Ereignis *getThis();
-    Ereignis *release();
 };

+ 4 - 4
StickmanWorldOnline/Geschoss.cpp

@@ -32,19 +32,19 @@ void Geschoss::invertDirection()
 
 void Geschoss::addUmlenkung( Spiel *zSpiel )
 {
-    zSpiel->setGeschossZuletztUmgelenkt( (Geschoss *)getThis() );
+    zSpiel->setGeschossZuletztUmgelenkt( dynamic_cast<Geschoss *>( getThis() ) );
     umgelenkt++;
 }
 
 void Geschoss::addGeschossTreffer( Spiel *zSpiel )
 {
-    zSpiel->setGeschossZuletztGeschossGetroffen( (Geschoss *)getThis() );
+    zSpiel->setGeschossZuletztGeschossGetroffen( dynamic_cast<Geschoss *>( getThis() ) );
     geschosseGetroffen++;
 }
 
 void Geschoss::addTunnel( Spiel *zSpiel )
 {
-    zSpiel->setGeschossZuletztTunnelBenutzt( (Geschoss *)getThis() );
+    zSpiel->setGeschossZuletztTunnelBenutzt( dynamic_cast<Geschoss *>( getThis() ) );
     schalter++;
 }
 
@@ -154,7 +154,7 @@ Spieler *Geschoss::zBesitzer() const
 
 Spieler *Geschoss::getBesitzer() const
 {
-    return besitzer ? (Spieler *)besitzer->getThis() : 0;
+    return besitzer ? dynamic_cast<Spieler *>( besitzer->getThis() ) : 0;
 }
 
 Richtung Geschoss::getRichtung() const

+ 2 - 17
StickmanWorldOnline/Klient.cpp

@@ -5,9 +5,9 @@
 // Inhalt der Klient Klasse aus Klient.h
 // Konstruktor
 Klient::Klient( SSKlientV *klient )
+    : ReferenceCounter()
 {
     this->klient = klient;
-    ref = 1;
 }
 
 // Destruktor
@@ -27,7 +27,7 @@ void Klient::online( SSKlientV *zKlient )
 {
     if( klient )
         klient = (SSKlientV *)klient->release();
-    klient = (SSKlientV *)zKlient->getThis();
+    klient = dynamic_cast<SSKlientV *>( zKlient->getThis() );
 }
 
 void Klient::sendeInit( RCArray< Spieler > *zSpieler, __int64 seed )
@@ -204,19 +204,4 @@ void Klient::sendeStatistikLadenFertig()
 bool Klient::istOnline() const
 {
     return klient != 0;
-}
-
-// reference Counting
-Klient *Klient::getThis()
-{
-    ref++;
-    return this;
-}
-
-Klient *Klient::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 2 - 16
StickmanWorldOnline/Reader.cpp

@@ -4,18 +4,18 @@
 
 // Konstruktor
 MapReader::MapReader( int karteId, SSDatenbankV *db, char *tmpPfad )
+    : ReferenceCounter()
 {
     this->karteId = karteId;
     this->db = db;
     pfad = new Text( tmpPfad );
-    ref = 1;
 }
 
 MapReader::MapReader()
+    : ReferenceCounter()
 {
     db = 0;
     pfad = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -1054,18 +1054,4 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         delete[] name;
     }
     mapFile.close();
-}
-
-// Reference Counting
-MapReader *MapReader::getThis()
-{
-    ref++;
-    return this;
-}
-
-MapReader *MapReader::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 1 - 5
StickmanWorldOnline/Reader.h

@@ -18,13 +18,12 @@ struct SpielerTeamStruktur
     Array< int > teamSize;
 };
 
-class MapReader
+class MapReader : public virtual ReferenceCounter
 {
 private:
     SSDatenbankV *db;
     Text *pfad;
     int karteId;
-    int ref;
 
 public:
     // Konstruktor
@@ -37,7 +36,4 @@ public:
     Aktion *readAktion( Datei &dat );
     void writeAktion( Aktion *zAk, Datei &dat );
     //void writeAktion( Aktion *ak, Datei &dat );
-    // Reference Counting
-    MapReader *getThis();
-    MapReader *release();
 };

+ 1 - 6
StickmanWorldOnline/SSDatenbankV.h

@@ -6,7 +6,7 @@
 
 using namespace Framework;
 
-class SSDatenbankV
+class SSDatenbankV : public virtual ReferenceCounter
 {
 private:
 
@@ -23,9 +23,4 @@ public:
     virtual bool setSpielSpielerStatus( int spielId, int accountId, int punkte, int status ) = 0;
     virtual bool addSpielerStatistik( int accountId, int spielId ) = 0;
     virtual Text *getSpielPfad( int karteId ) = 0;
-    // constant
-
-    // Reference Counting
-    virtual SSDatenbankV *getThis() = 0;
-    virtual SSDatenbankV *release() = 0;
 };

+ 2 - 5
StickmanWorldOnline/SSKlient.h

@@ -2,16 +2,16 @@
 
 #include <Array.h>
 #include <Vec2.h>
+#include <ReferenceCounter.h>
 #include "SSKlientV.h"
 
 class Spieler;
 class Team;
 
-class Klient
+class Klient : public virtual Framework::ReferenceCounter
 {
 private:
     SSKlientV *klient;
-    int ref;
 
 public:
     // Konstruktor
@@ -35,7 +35,4 @@ public:
     void sendeStatistikLadenFertig();
     // constant
     bool istOnline() const;
-    // reference Counting
-    Klient *getThis();
-    Klient *release();
 };

+ 2 - 2
StickmanWorldOnline/Schalter.cpp

@@ -17,10 +17,10 @@ void Schalter::setAktive( bool aktiv )
 
 void Schalter::press( Spiel *zSpiel )
 {
-    zSpiel->setSchalterZuletztAktiviert( (Schalter *)getThis() );
+    zSpiel->setSchalterZuletztAktiviert( dynamic_cast<Schalter *>( getThis() ) );
     aktivierungen++;
     Ereignis *e = new Ereignis( SCHALTER_AKTIVIERT );
-    e->addParameter( "Betroffener Schalter", getThis() );
+    e->addParameter( "Betroffener Schalter", dynamic_cast<Schalter *>( getThis() ) );
     zSpiel->throwEvent( e );
 }
 

+ 68 - 82
StickmanWorldOnline/Spiel.cpp

@@ -6,6 +6,7 @@
 
 // Konstruktor
 Spiel::Spiel()
+    : ReferenceCounter()
 {
     zKlients = 0;
     psqldb = 0;
@@ -56,7 +57,6 @@ Spiel::Spiel()
     zuletztBenutzteUmlenkung = 0;
     nextAutoVerschiebung = 10;
     nextAutoSchaltung = 10;
-    ref = 1;
 }
 
 // Destruktor
@@ -137,7 +137,7 @@ void Spiel::setPSQLK( SSDatenbankV *psqldb )
     if( this->psqldb )
         this->psqldb->release();
     this->psqldb = psqldb;
-    stat->setPSQLDB( psqldb->getThis() );
+    stat->setPSQLDB( dynamic_cast<SSDatenbankV *>( psqldb->getThis() ) );
 }
 // call 1
 void Spiel::setSpielId( int id )
@@ -162,7 +162,7 @@ void Spiel::setAccounts( int anzahl, Array< int > *zAccounts )
 {
     if( this->zAccounts )
         this->zAccounts->release();
-    this->zAccounts = zAccounts->getThis();
+    this->zAccounts = dynamic_cast<Array<int> *>( zAccounts->getThis() );
     spielerAnzahl = anzahl;
 }
 // call 4
@@ -170,12 +170,12 @@ void Spiel::setKlients( int anzahl, RCArray< SSKlientV > *zKlients )
 {
     if( this->zKlients )
         this->zKlients->release();
-    this->zKlients = zKlients->getThis();
+    this->zKlients = dynamic_cast<RCArray<SSKlientV> *>( zKlients->getThis() );
 }
 // call 5
 void Spiel::setSpielerNummern( int anzahl, Array< int > *spielerNummern )
 {
-    MapReader *reader = new MapReader( karteId, psqldb->getThis(), mapPfad );
+    MapReader *reader = new MapReader( karteId, dynamic_cast<SSDatenbankV *>( psqldb->getThis() ), mapPfad );
     reader->ladeKarte( this );
     reader->release();
     for( int i = 0; i < anzahl; i++ )
@@ -190,8 +190,8 @@ void Spiel::setSpielerNummern( int anzahl, Array< int > *spielerNummern )
             }
         }
     }
-    zAccounts = zAccounts->release();
-    zKlients = zKlients->release();
+    zAccounts = ( Array<int>* )zAccounts->release();
+    zKlients = ( RCArray<SSKlientV>* )zKlients->release();
     stat->setTeams( &teams );
     stat->setSpieler( &spieler );
 }
@@ -209,7 +209,7 @@ void Spiel::run()
     time_t t;
     time( &t );
     srand( (unsigned int)t );
-    log->schreibe( (char *)& spielerAnzahl, 4 );
+    log->schreibe( (char *)&spielerAnzahl, 4 );
     int anz = spieler.getEintragAnzahl();
     for( int i = 0; i < anz; i++ )
     {
@@ -217,9 +217,9 @@ void Spiel::run()
         if( tmp && tmp->zKlient() )
         {
             tmp->zKlient()->sendeInit( &spieler, randG.getSeed() );
-            log->schreibe( (char *)& i, 4 );
+            log->schreibe( (char *)&i, 4 );
             int sNum = tmp->getId();
-            log->schreibe( (char *)& sNum, 4 );
+            log->schreibe( (char *)&sNum, 4 );
             tmp->zKlient()->sendeSpielerNummer( sNum );
             Text *name = psqldb->getAccountRufName( tmp->getAccountId() );
             char len = (char)( name ? name->getLength() : 0 );
@@ -234,7 +234,7 @@ void Spiel::run()
         }
     }
     __int64 randSeed = randG.getSeed();
-    log->schreibe( (char *)& randSeed, 8 );
+    log->schreibe( (char *)&randSeed, 8 );
     Array< char > spielerStatus;
     ZeitMesser *zeit = new ZeitMesser();
     zeit->messungStart();
@@ -307,7 +307,7 @@ void Spiel::run()
         }
     }
     log->close();
-    log = log->release();
+    log = (Datei *)log->release();
     isRunning = 0;
 }
 // call 7
@@ -369,7 +369,7 @@ void Spiel::nachricht( int accountId, int len, char *bytes )
                 }
                 Ereignis *e = new Ereignis( SPIELER_KEY_PRESSED );
                 e->addParameter( "Betroffene Taste", new Integer( *bytes, 1 ) );
-                e->addParameter( "Ausführender Spieler", tmp->getThis() );
+                e->addParameter( "Ausführender Spieler", dynamic_cast<Spieler *>( tmp->getThis() ) );
                 throwEvent( e );
                 for( int j = 0; j < spieler.getEintragAnzahl(); j++ )
                 {
@@ -389,14 +389,14 @@ void Spiel::nachricht( int accountId, int len, char *bytes )
             Spieler *tmp = spieler.z( i );
             if( tmp && tmp->getAccountId() == accountId )
             {
-                if( !tmp->setTastenStand( (unsigned char)* bytes, 0 ) )
+                if( !tmp->setTastenStand( (unsigned char)*bytes, 0 ) )
                 {
                     saveMSG = 0;
                     break;
                 }
                 Ereignis *e = new Ereignis( SPIELER_KEY_RELEASED );
                 e->addParameter( "Betroffene Taste", new Integer( *bytes, 1 ) );
-                e->addParameter( "Ausführender Spieler", tmp->getThis() );
+                e->addParameter( "Ausführender Spieler", dynamic_cast<Spieler *>( tmp->getThis() ) );
                 throwEvent( e );
                 for( int j = 0; j < spieler.getEintragAnzahl(); j++ )
                 {
@@ -446,9 +446,9 @@ void Spiel::nachricht( int accountId, int len, char *bytes )
                 break;
             }
         }
-        log->schreibe( (char *)& spielerNum, 4 );
+        log->schreibe( (char *)&spielerNum, 4 );
         short l = (short)msgLen;
-        log->schreibe( (char *)& l, 2 );
+        log->schreibe( (char *)&l, 2 );
         log->schreibe( msgBeg, l );
     }
     c.unlock();
@@ -577,7 +577,7 @@ void Spiel::tick( double zeit )
         {
             if( zuletztBariereGetroffenesGeschoss )
                 zuletztBariereGetroffenesGeschoss->release();
-            zuletztBariereGetroffenesGeschoss = (Geschoss *)g->getThis();
+            zuletztBariereGetroffenesGeschoss = dynamic_cast<Geschoss *>( g->getThis() );
             g->tick( -zeit );
             switch( g->getTyp() )
             {
@@ -628,8 +628,8 @@ void Spiel::tick( double zeit )
                     g->setY( g->getY() + (float)t->getZielY() - t->getY() );
                     g->addTunnel( this );
                     Ereignis *e = new Ereignis( TUNNEL_BENUTZT );
-                    e->addParameter( "Betroffes Geschoss", g->getThis() );
-                    e->addParameter( "Betroffer Tunnel", t->getThis() );
+                    e->addParameter( "Betroffes Geschoss", dynamic_cast<Geschoss *>( g->getThis() ) );
+                    e->addParameter( "Betroffer Tunnel", dynamic_cast<Tunnel *>( t->getThis() ) );
                     throwEvent( e );
                 }
             }
@@ -662,8 +662,8 @@ void Spiel::tick( double zeit )
                             g->addUmlenkung( this );
                             u->addBenutzt( this );
                             Ereignis *e = new Ereignis( UMLENKUNG_LENKT_UM );
-                            e->addParameter( "Betroffes Geschoss", g->getThis() );
-                            e->addParameter( "Betroffe Umlenkung", u->getThis() );
+                            e->addParameter( "Betroffes Geschoss", dynamic_cast<Geschoss *>( g->getThis() ) );
+                            e->addParameter( "Betroffe Umlenkung", dynamic_cast<Umlenkung *>( u->getThis() ) );
                             throwEvent( e );
                         }
                     }
@@ -859,7 +859,7 @@ void Spiel::addGegenstand( Gegenstand *gegenstand )
     items.add( gegenstand );
     zuletztGedropterGegenstand = gegenstand->getTyp();
     Ereignis *e = new Ereignis( GEGENSTAND_DROPED );
-    e->addParameter( "Betroffener Gegenstand", gegenstand->getThis() );
+    e->addParameter( "Betroffener Gegenstand", dynamic_cast<Gegenstand *>( gegenstand->getThis() ) );
     throwEvent( e );
 }
 
@@ -868,7 +868,7 @@ void Spiel::addGeschoss( Geschoss *geschoss )
     nextId = nextId > geschoss->getId() ? nextId : geschoss->getId() + 1;
     if( zuletztAbgefeuertesGeschoss )
         zuletztAbgefeuertesGeschoss->release();
-    zuletztAbgefeuertesGeschoss = (Geschoss *)geschoss->getThis();
+    zuletztAbgefeuertesGeschoss = dynamic_cast<Geschoss *>( geschoss->getThis() );
     shots.add( geschoss );
 }
 
@@ -960,7 +960,7 @@ Team *Spiel::getTeam( int id ) const
     for( auto t = teams.getIterator(); t; t++ )
     {
         if( t->getTeamNummer() == id )
-            return (Team *)t->getThis();
+            return dynamic_cast<Team *>( t->getThis() );
     }
     return 0;
 }
@@ -970,7 +970,7 @@ Spieler *Spiel::getSpieler( int id ) const
     for( auto s = spieler.getIterator(); s; s++ )
     {
         if( s->getId() == id )
-            return (Spieler *)s->getThis();
+            return dynamic_cast<Spieler *>( s->getThis() );
     }
     return 0;
 }
@@ -990,7 +990,7 @@ Bariere *Spiel::getBariere( int id ) const
     for( auto b = barieren.getIterator(); b; b++ )
     {
         if( b->getId() == id )
-            return (Bariere *)b->getThis();
+            return dynamic_cast<Bariere *>( b->getThis() );
     }
     return 0;
 }
@@ -1000,7 +1000,7 @@ Base *Spiel::getBase( int id ) const
     for( auto b = basen.getIterator(); b; b++ )
     {
         if( b->getId() == id )
-            return (Base *)b->getThis();
+            return dynamic_cast<Base *>( b->getThis() );
     }
     return 0;
 }
@@ -1010,7 +1010,7 @@ Drop *Spiel::getDrop( int id ) const
     for( auto d = drops.getIterator(); d; d++ )
     {
         if( d->getId() == id )
-            return (Drop *)d->getThis();
+            return dynamic_cast<Drop *>( d->getThis() );
     }
     return 0;
 }
@@ -1020,7 +1020,7 @@ Schalter *Spiel::getSchalter( int id ) const
     for( auto s = schalter.getIterator(); s; s++ )
     {
         if( s->getId() == id )
-            return (Schalter *)s->getThis();
+            return dynamic_cast<Schalter *>( s->getThis() );
     }
     return 0;
 }
@@ -1030,7 +1030,7 @@ Schiene *Spiel::getSchiene( int id ) const
     for( auto s = schienen.getIterator(); s; s++ )
     {
         if( s->getId() == id )
-            return (Schiene *)s->getThis();
+            return dynamic_cast<Schiene *>( s->getThis() );
     }
     return 0;
 }
@@ -1040,7 +1040,7 @@ Timer *Spiel::getTimer( int id ) const
     for( auto t = timer.getIterator(); t; t++ )
     {
         if( t->getId() == id )
-            return (Timer *)t->getThis();
+            return dynamic_cast<Timer *>( t->getThis() );
     }
     return 0;
 }
@@ -1050,7 +1050,7 @@ Tunnel *Spiel::getTunnel( int id ) const
     for( auto t = tunnel.getIterator(); t; t++ )
     {
         if( t->getId() == id )
-            return (Tunnel *)t->getThis();
+            return dynamic_cast<Tunnel *>( t->getThis() );
     }
     return 0;
 }
@@ -1060,7 +1060,7 @@ Umlenkung *Spiel::getUmlenkung( int id ) const
     for( auto u = umlenkungen.getIterator(); u; u++ )
     {
         if( u->getId() == id )
-            return (Umlenkung *)u->getThis();
+            return dynamic_cast<Umlenkung *>( u->getThis() );
     }
     return 0;
 }
@@ -1070,7 +1070,7 @@ Trigger *Spiel::getTrigger( int id ) const
     for( auto t = trigger.getIterator(); t; t++ )
     {
         if( t->getId() == id )
-            return (Trigger *)t->getThis();
+            return dynamic_cast<Trigger *>( t->getThis() );
     }
     return 0;
 }
@@ -1115,7 +1115,7 @@ void Spiel::throwEvent( Ereignis *e )
     {
         if( t->hatEreignis( e->getTyp() ) )
         {
-            TriggerRun *tr = t->runTrigger( e->getThis(), this );
+            TriggerRun *tr = t->runTrigger( dynamic_cast<Ereignis *>( e->getThis() ), this );
             if( tr )
                 triggerRuns.add( tr );
         }
@@ -1163,7 +1163,7 @@ Trigger *Spiel::getRandomTrigger()
 
 Trigger *Spiel::getLastRunnedTrigger() const
 {
-    return lastRunnedTrigger ? (Trigger *)lastRunnedTrigger->getThis() : 0;
+    return lastRunnedTrigger ? dynamic_cast<Trigger *>( lastRunnedTrigger->getThis() ) : 0;
 }
 
 Bariere *Spiel::getRandomBariere()
@@ -1180,7 +1180,7 @@ void Spiel::setZuletztEingeschalteteBariere( Bariere *b )
 
 Bariere *Spiel::getZuletztEingeschalteteBariere() const
 {
-    return zuletztEingeschalteteBariere ? (Bariere *)zuletztEingeschalteteBariere->getThis() : 0;
+    return zuletztEingeschalteteBariere ? dynamic_cast<Bariere *>( zuletztEingeschalteteBariere->getThis() ) : 0;
 }
 
 void Spiel::setZuletztAusgeschalteteBariere( Bariere *b )
@@ -1192,7 +1192,7 @@ void Spiel::setZuletztAusgeschalteteBariere( Bariere *b )
 
 Bariere *Spiel::getZuletztAusgeschalteteBariere() const
 {
-    return zuletztAusgeschalteteBariere ? (Bariere *)zuletztAusgeschalteteBariere->getThis() : 0;
+    return zuletztAusgeschalteteBariere ? dynamic_cast<Bariere *>( zuletztAusgeschalteteBariere->getThis() ) : 0;
 }
 
 void Spiel::setZuletztBewegteBariere( Bariere *b )
@@ -1204,7 +1204,7 @@ void Spiel::setZuletztBewegteBariere( Bariere *b )
 
 Bariere *Spiel::getZuletztBewegteBariere() const
 {
-    return zuletztBewegteBariere ? (Bariere *)zuletztBewegteBariere->getThis() : 0;
+    return zuletztBewegteBariere ? dynamic_cast<Bariere *>( zuletztBewegteBariere->getThis() ) : 0;
 }
 
 Base *Spiel::getRandomBase()
@@ -1223,7 +1223,7 @@ void Spiel::setLastTeamChangedBase( Base *b )
 
 Base *Spiel::getLastTeamChangedBase() const
 {
-    return lastTeamChangedBase ? (Base *)lastTeamChangedBase->getThis() : 0;
+    return lastTeamChangedBase ? dynamic_cast<Base *>( lastTeamChangedBase->getThis() ) : 0;
 }
 
 Drop *Spiel::getRandomDrop()
@@ -1242,7 +1242,7 @@ void Spiel::setLastDrop( Drop *d )
 
 Drop *Spiel::getLastDrop() const
 {
-    return lastDropedDrop ? (Drop *)lastDropedDrop->getThis() : 0;
+    return lastDropedDrop ? dynamic_cast<Drop *>( lastDropedDrop->getThis() ) : 0;
 }
 
 void Spiel::setItemZuletztAufgehoben( GegenstandTyp g )
@@ -1279,7 +1279,7 @@ Geschoss *Spiel::getRandomGeschoss()
 
 Geschoss *Spiel::getGeschossZuletztAbgefeuert() const
 {
-    return zuletztAbgefeuertesGeschoss ? (Geschoss *)zuletztAbgefeuertesGeschoss->getThis() : 0;
+    return zuletztAbgefeuertesGeschoss ? dynamic_cast<Geschoss *>( zuletztAbgefeuertesGeschoss->getThis() ) : 0;
 }
 
 void Spiel::setGeschossZuletztUmgelenkt( Geschoss *g )
@@ -1291,12 +1291,12 @@ void Spiel::setGeschossZuletztUmgelenkt( Geschoss *g )
 
 Geschoss *Spiel::getGeschossZuletztUmgelenkt() const
 {
-    return zuletztUmgelenktesGeschoss ? (Geschoss *)zuletztUmgelenktesGeschoss->getThis() : 0;
+    return zuletztUmgelenktesGeschoss ? dynamic_cast<Geschoss *>( zuletztUmgelenktesGeschoss->getThis() ) : 0;
 }
 
 Geschoss *Spiel::getGeschossZuletztBariereGetroffen() const
 {
-    return zuletztBariereGetroffenesGeschoss ? (Geschoss *)zuletztBariereGetroffenesGeschoss->getThis() : 0;
+    return zuletztBariereGetroffenesGeschoss ? dynamic_cast<Geschoss *>( zuletztBariereGetroffenesGeschoss->getThis() ) : 0;
 }
 
 void Spiel::setGeschossZuletztTunnelBenutzt( Geschoss *g )
@@ -1308,7 +1308,7 @@ void Spiel::setGeschossZuletztTunnelBenutzt( Geschoss *g )
 
 Geschoss *Spiel::getGeschossZuletztTunnelBenutzt() const
 {
-    return zuletztTunnelBenutztesGeschoss ? (Geschoss *)zuletztTunnelBenutztesGeschoss->getThis() : 0;
+    return zuletztTunnelBenutztesGeschoss ? dynamic_cast<Geschoss *>( zuletztTunnelBenutztesGeschoss->getThis() ) : 0;
 }
 
 void Spiel::setGeschossZuletztGeschossGetroffen( Geschoss *g )
@@ -1320,7 +1320,7 @@ void Spiel::setGeschossZuletztGeschossGetroffen( Geschoss *g )
 
 Geschoss *Spiel::getGeschossZuletztGeschossGetroffen() const
 {
-    return zuletztGeschossGetroffenesGeschoss ? (Geschoss *)zuletztGeschossGetroffenesGeschoss->getThis() : 0;
+    return zuletztGeschossGetroffenesGeschoss ? dynamic_cast<Geschoss *>( zuletztGeschossGetroffenesGeschoss->getThis() ) : 0;
 }
 
 Schalter *Spiel::getRandomSchalter()
@@ -1339,7 +1339,7 @@ void Spiel::setSchalterZuletztAktiviert( Schalter *s )
 
 Schalter *Spiel::getSchalterZuletztAktiviert() const
 {
-    return zuletztAktivierterSchalter ? (Schalter *)zuletztAktivierterSchalter->getThis() : 0;
+    return zuletztAktivierterSchalter ? dynamic_cast<Schalter *>( zuletztAktivierterSchalter->getThis() ) : 0;
 }
 
 Spieler *Spiel::getRandomSpieler()
@@ -1359,7 +1359,7 @@ Spieler *Spiel::getRandomSpieler( Team *zTeam )
         if( s->zTeam() == zTeam )
         {
             if( index-- <= 0 )
-                return (Spieler *)s->getThis();
+                return dynamic_cast<Spieler *>( s->getThis() );
         }
     }
     return 0;
@@ -1374,7 +1374,7 @@ void Spiel::setSpielerZuletztSchadenGemacht( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztSchadenGemacht() const
 {
-    return zuletztSchadenGemachterSpieler ? (Spieler *)zuletztSchadenGemachterSpieler->getThis() : 0;
+    return zuletztSchadenGemachterSpieler ? dynamic_cast<Spieler *>( zuletztSchadenGemachterSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztSchadenGenommen( Spieler *s )
@@ -1386,7 +1386,7 @@ void Spiel::setSpielerZuletztSchadenGenommen( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztSchadenGenommen() const
 {
-    return zuletztSchadenGenommenerSpieler ? (Spieler *)zuletztSchadenGenommenerSpieler->getThis() : 0;
+    return zuletztSchadenGenommenerSpieler ? dynamic_cast<Spieler *>( zuletztSchadenGenommenerSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztGeheilt( Spieler *s )
@@ -1398,7 +1398,7 @@ void Spiel::setSpielerZuletztGeheilt( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztGeheilt() const
 {
-    return zuletztGeheilterSpieler ? (Spieler *)zuletztGeheilterSpieler->getThis() : 0;
+    return zuletztGeheilterSpieler ? dynamic_cast<Spieler *>( zuletztGeheilterSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztLevelUp( Spieler *s )
@@ -1410,7 +1410,7 @@ void Spiel::setSpielerZuletztLevelUp( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztLevelUp() const
 {
-    return zuletztLevelUpSpieler ? (Spieler *)zuletztLevelUpSpieler->getThis() : 0;
+    return zuletztLevelUpSpieler ? dynamic_cast<Spieler *>( zuletztLevelUpSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztErfahrungBekommen( Spieler *s )
@@ -1422,7 +1422,7 @@ void Spiel::setSpielerZuletztErfahrungBekommen( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztErfahrungBekommen() const
 {
-    return zuletztErfahrungBekommenerSpieler ? (Spieler *)zuletztErfahrungBekommenerSpieler->getThis() : 0;
+    return zuletztErfahrungBekommenerSpieler ? dynamic_cast<Spieler *>( zuletztErfahrungBekommenerSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztGegenstandAktiviert( Spieler *s )
@@ -1434,7 +1434,7 @@ void Spiel::setSpielerZuletztGegenstandAktiviert( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztGegenstandAktiviert() const
 {
-    return zuletztGegenstandAktivierterSpieler ? (Spieler *)zuletztGegenstandAktivierterSpieler->getThis() : 0;
+    return zuletztGegenstandAktivierterSpieler ? dynamic_cast<Spieler *>( zuletztGegenstandAktivierterSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztGegenstandAufgehoben( Spieler *s )
@@ -1446,7 +1446,7 @@ void Spiel::setSpielerZuletztGegenstandAufgehoben( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztGegenstandAufgehoben() const
 {
-    return zuletztGegenstandAufgehobenerSpieler ? (Spieler *)zuletztGegenstandAufgehobenerSpieler->getThis() : 0;
+    return zuletztGegenstandAufgehobenerSpieler ? dynamic_cast<Spieler *>( zuletztGegenstandAufgehobenerSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztSchalterAktiviert( Spieler *s )
@@ -1458,7 +1458,7 @@ void Spiel::setSpielerZuletztSchalterAktiviert( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztSchalterAktiviert() const
 {
-    return zuletztSchalterAktivierterSpieler ? (Spieler *)zuletztSchalterAktivierterSpieler->getThis() : 0;
+    return zuletztSchalterAktivierterSpieler ? dynamic_cast<Spieler *>( zuletztSchalterAktivierterSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztTunnelBenutzt( Spieler *s )
@@ -1470,7 +1470,7 @@ void Spiel::setSpielerZuletztTunnelBenutzt( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztTunnelBenutzt() const
 {
-    return zuletztTunnelBenutzterSpieler ? (Spieler *)zuletztTunnelBenutzterSpieler->getThis() : 0;
+    return zuletztTunnelBenutzterSpieler ? dynamic_cast<Spieler *>( zuletztTunnelBenutzterSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztGestorben( Spieler *s )
@@ -1482,7 +1482,7 @@ void Spiel::setSpielerZuletztGestorben( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztGestorben() const
 {
-    return zuletztGestorbenerSpieler ? (Spieler *)zuletztGestorbenerSpieler->getThis() : 0;
+    return zuletztGestorbenerSpieler ? dynamic_cast<Spieler *>( zuletztGestorbenerSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztWiederbelebt( Spieler *s )
@@ -1494,7 +1494,7 @@ void Spiel::setSpielerZuletztWiederbelebt( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztWiederbelebt() const
 {
-    return zuletztWiederbelebterSpieler ? (Spieler *)zuletztWiederbelebterSpieler->getThis() : 0;
+    return zuletztWiederbelebterSpieler ? dynamic_cast<Spieler *>( zuletztWiederbelebterSpieler->getThis() ) : 0;
 }
 
 void Spiel::setSpielerZuletztGeschossen( Spieler *s )
@@ -1506,7 +1506,7 @@ void Spiel::setSpielerZuletztGeschossen( Spieler *s )
 
 Spieler *Spiel::getSpielerZuletztGeschossen() const
 {
-    return zuletztGeschossenerSpieler ? (Spieler *)zuletztGeschossenerSpieler->getThis() : 0;
+    return zuletztGeschossenerSpieler ? dynamic_cast<Spieler *>( zuletztGeschossenerSpieler->getThis() ) : 0;
 }
 
 Team *Spiel::getRandomTeam()
@@ -1532,7 +1532,7 @@ void Spiel::setTimerZuletztAbgelaufen( Timer *t )
 
 Timer *Spiel::getTimerZuletztAbgelaufen() const
 {
-    return zuletztAbgelaufenerTimer ? (Timer *)zuletztAbgelaufenerTimer->getThis() : 0;
+    return zuletztAbgelaufenerTimer ? dynamic_cast<Timer *>( zuletztAbgelaufenerTimer->getThis() ) : 0;
 }
 
 void Spiel::setTimerZuletztGestartet( Timer *t )
@@ -1544,7 +1544,7 @@ void Spiel::setTimerZuletztGestartet( Timer *t )
 
 Timer *Spiel::getTimerZuletztGestartet() const
 {
-    return zuletztGestarteterTimer ? (Timer *)zuletztGestarteterTimer->getThis() : 0;
+    return zuletztGestarteterTimer ? dynamic_cast<Timer *>( zuletztGestarteterTimer->getThis() ) : 0;
 }
 
 void Spiel::setTimerZuletztPausiert( Timer *t )
@@ -1556,7 +1556,7 @@ void Spiel::setTimerZuletztPausiert( Timer *t )
 
 Timer *Spiel::getTimerZuletztPausiert() const
 {
-    return zuletztPausierterTimer ? (Timer *)zuletztPausierterTimer->getThis() : 0;
+    return zuletztPausierterTimer ? dynamic_cast<Timer *>( zuletztPausierterTimer->getThis() ) : 0;
 }
 
 void Spiel::setTimerZuletztFortgesetzt( Timer *t )
@@ -1568,7 +1568,7 @@ void Spiel::setTimerZuletztFortgesetzt( Timer *t )
 
 Timer *Spiel::getTimerZuletztFortgesetzt() const
 {
-    return zuletztFortgesetzterTimer ? (Timer *)zuletztFortgesetzterTimer->getThis() : 0;
+    return zuletztFortgesetzterTimer ? dynamic_cast<Timer *>( zuletztFortgesetzterTimer->getThis() ) : 0;
 }
 
 Tunnel *Spiel::getRandomTunnel()
@@ -1587,7 +1587,7 @@ void Spiel::setTunnelZuletztBenutzt( Tunnel *t )
 
 Tunnel *Spiel::getTunnelZuletztBenutzt() const
 {
-    return zuletztBenutzterTunnel ? (Tunnel *)zuletztBenutzterTunnel->getThis() : 0;
+    return zuletztBenutzterTunnel ? dynamic_cast<Tunnel *>( zuletztBenutzterTunnel->getThis() ) : 0;
 }
 
 Umlenkung *Spiel::getRandomUmlenkung()
@@ -1606,24 +1606,10 @@ void Spiel::setUmlenkungZuletztBenutzt( Umlenkung *t )
 
 Umlenkung *Spiel::getUmlenkungZuletztBenutzt() const
 {
-    return zuletztBenutzteUmlenkung ? (Umlenkung *)zuletztBenutzteUmlenkung->getThis() : 0;
+    return zuletztBenutzteUmlenkung ? dynamic_cast<Umlenkung *>( zuletztBenutzteUmlenkung->getThis() ) : 0;
 }
 
 StatistikV *Spiel::getStatistik() const
 {
-    return stat->getThis();
-}
-
-// Reference Counting 
-SpielKlasse *Spiel::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpielKlasse *Spiel::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
+    return dynamic_cast<StatistikV *>( stat->getThis() );
 }

+ 0 - 4
StickmanWorldOnline/Spiel.h

@@ -93,7 +93,6 @@ private:
     bool pause;
     double nextAutoVerschiebung;
     double nextAutoSchaltung;
-    int ref;
 
 public:
     // Konstruktor
@@ -231,7 +230,4 @@ public:
     Umlenkung *getUmlenkungZuletztBenutzt() const;
     // constant
     StatistikV *getStatistik() const override;
-    // Reference Counting 
-    SpielKlasse *getThis() override;
-    SpielKlasse *release() override;
 };

+ 1 - 4
StickmanWorldOnline/SpielKlasse.h

@@ -7,7 +7,7 @@
 
 using namespace Framework;
 
-class SpielKlasse
+class SpielKlasse : public virtual ReferenceCounter
 {
 private:
 
@@ -28,7 +28,4 @@ public:
     virtual void run() = 0;
     // constant
     virtual StatistikV *getStatistik() const = 0;
-    // Reference Counting 
-    virtual SpielKlasse *getThis() = 0;
-    virtual SpielKlasse *release() = 0;
 };

+ 34 - 34
StickmanWorldOnline/Spieler.cpp

@@ -287,9 +287,9 @@ void Spieler::setLaufTempo( float pps )
 void Spieler::addErfahrung( float anz, Spiel *zSpiel )
 {
     erfahrung += anz;
-    zSpiel->setSpielerZuletztErfahrungBekommen( (Spieler *)getThis() );
+    zSpiel->setSpielerZuletztErfahrungBekommen( dynamic_cast<Spieler *>( getThis() ) );
     Ereignis *e = new Ereignis( SPIELER_BEKOMMT_ERFAHRUNG );
-    e->addParameter( "Betroffener Spieler", getThis() );
+    e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
     e->addParameter( "Wert", new Float( anz ) );
     zSpiel->throwEvent( e );
     while( erfahrung > (float)maxErfahrung )
@@ -322,9 +322,9 @@ void Spieler::levelUp( Spiel *zSpiel )
     }
     if( level <= 100 )
         lebensRegeneration += 0.25f;
-    zSpiel->setSpielerZuletztLevelUp( (Spieler *)getThis() );
+    zSpiel->setSpielerZuletztLevelUp( dynamic_cast<Spieler *>( getThis() ) );
     Ereignis *e = new Ereignis( SPIELER_LEVEL_UP );
-    e->addParameter( "Betroffener Spieler", getThis() );
+    e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
     zSpiel->throwEvent( e );
 }
 
@@ -356,13 +356,13 @@ void Spieler::levelDown( Spiel *zSpiel )
 void Spieler::addTunnelBenutzung( Spiel *zSpiel )
 {
     tunnelBenutzt++;
-    zSpiel->setSpielerZuletztTunnelBenutzt( (Spieler *)getThis() );
+    zSpiel->setSpielerZuletztTunnelBenutzt( dynamic_cast<Spieler *>( getThis() ) );
 }
 
 void Spieler::addSchalterBenutzung( Spiel *zSpiel )
 {
     schalterAktiviert++;
-    zSpiel->setSpielerZuletztSchalterAktiviert( (Spieler *)getThis() );
+    zSpiel->setSpielerZuletztSchalterAktiviert( dynamic_cast<Spieler *>( getThis() ) );
 }
 
 // aktualisiert auch die team statistik
@@ -407,9 +407,9 @@ void Spieler::wiederbelebung( Spiel *zSpiel )
 {
     amLeben = 1;
     leben = (float)maxLeben;
-    zSpiel->setSpielerZuletztWiederbelebt( (Spieler *)getThis() );
+    zSpiel->setSpielerZuletztWiederbelebt( dynamic_cast<Spieler *>( getThis() ) );
     Ereignis *e = new Ereignis( SPIELER_WIEDERBELEBT );
-    e->addParameter( "Betroffener Spieler", getThis() );
+    e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
     zSpiel->throwEvent( e );
 }
 
@@ -452,7 +452,7 @@ void Spieler::useItem( Spiel *zSpiel )
 {
     if( istAmLeben() && inv.selectedItem() != KEIN_GEGENSTAND && istGegenstandErlaubt( inv.selectedItem() ) )
     {
-        zSpiel->setSpielerZuletztGegenstandAktiviert( (Spieler *)getThis() );
+        zSpiel->setSpielerZuletztGegenstandAktiviert( dynamic_cast<Spieler *>( getThis() ) );
         itemsVerwendet++;
         GegenstandTyp typ = inv.useItem();
         zSpiel->setItemZuletztAktiviert( typ );
@@ -460,8 +460,8 @@ void Spieler::useItem( Spiel *zSpiel )
         {
         case PFEIL:
             geschosseGeschossen++;
-            zSpiel->setSpielerZuletztGeschossen( (Spieler *)getThis() );
-            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), geschossTempo, GESCHOSS_PFEIL, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, (Spieler *)getThis() ) );
+            zSpiel->setSpielerZuletztGeschossen( dynamic_cast<Spieler *>( getThis() ) );
+            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), geschossTempo, GESCHOSS_PFEIL, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, dynamic_cast<Spieler *>( getThis() ) ) );
             break;
         case LEBEN:
             addEffekt( new LebenEffect( this ) );
@@ -477,8 +477,8 @@ void Spieler::useItem( Spiel *zSpiel )
             break;
         case KUGEL:
             geschosseGeschossen++;
-            zSpiel->setSpielerZuletztGeschossen( (Spieler *)getThis() );
-            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), geschossTempo, GESCHOSS_KUGEL, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, (Spieler *)getThis() ) );
+            zSpiel->setSpielerZuletztGeschossen( dynamic_cast<Spieler *>( getThis() ) );
+            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), geschossTempo, GESCHOSS_KUGEL, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, dynamic_cast<Spieler *>( getThis() ) ) );
             break;
         case ROLLE:
             addEffekt( new RolleEffect( this, getAusrichtung() ) );
@@ -488,27 +488,27 @@ void Spieler::useItem( Spiel *zSpiel )
             break;
         case DRACHENAUGE:
             geschosseGeschossen++;
-            zSpiel->setSpielerZuletztGeschossen( (Spieler *)getThis() );
-            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), geschossTempo, GESCHOSS_DRACHENAUGE, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, (Spieler *)getThis() ) );
+            zSpiel->setSpielerZuletztGeschossen( dynamic_cast<Spieler *>( getThis() ) );
+            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), geschossTempo, GESCHOSS_DRACHENAUGE, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, dynamic_cast<Spieler *>( getThis() ) ) );
             break;
         case FEUERBALL:
             geschosseGeschossen++;
-            zSpiel->setSpielerZuletztGeschossen( (Spieler *)getThis() );
-            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), geschossTempo, GESCHOSS_FEUERBALL, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, (Spieler *)getThis() ) );
+            zSpiel->setSpielerZuletztGeschossen( dynamic_cast<Spieler *>( getThis() ) );
+            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), geschossTempo, GESCHOSS_FEUERBALL, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, dynamic_cast<Spieler *>( getThis() ) ) );
             break;
         case ENTERHAKEN:
             addEffekt( new EnterhakenEffect( this, getAusrichtung() ) );
             break;
         case MINE:
             geschosseGeschossen++;
-            zSpiel->setSpielerZuletztGeschossen( (Spieler *)getThis() );
-            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), 0, GESCHOSS_MINE, MITTE, (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, (Spieler *)getThis() ) );
+            zSpiel->setSpielerZuletztGeschossen( dynamic_cast<Spieler *>( getThis() ) );
+            zSpiel->addGeschoss( new Geschoss( zSpiel->getNextId(), 0, GESCHOSS_MINE, MITTE, (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, dynamic_cast<Spieler *>( getThis() ) ) );
             break;
         default:
             break;
         }
         Ereignis *e = new Ereignis( SPIELER_BENUTZT_GEGENSTAND );
-        e->addParameter( "Betroffener Spieler", getThis() );
+        e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
         e->addParameter( "Betroffener Gegenstand", new GegenstandTypVar( typ ) );
         zSpiel->throwEvent( e );
     }
@@ -521,11 +521,11 @@ bool Spieler::addItem( GegenstandTyp typ, int anz, Spiel *zSpiel )
         if( inv.canAddItem( typ ) )
         {
             zSpiel->setItemZuletztAufgehoben( typ );
-            zSpiel->setSpielerZuletztGegenstandAufgehoben( (Spieler *)getThis() );
+            zSpiel->setSpielerZuletztGegenstandAufgehoben( dynamic_cast<Spieler *>( getThis() ) );
             itemsAufgehoben += anz;
             inv.addItem( typ, anz );
             Ereignis *e = new Ereignis( SPIELER_BEKOMMT_GEGENSTAND );
-            e->addParameter( "Betroffener Spieler", getThis() );
+            e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
             e->addParameter( "Betroffener Gegenstand", new GegenstandTypVar( typ ) );
             e->addParameter( "Anzahl", new Integer( anz ) );
             zSpiel->throwEvent( e );
@@ -537,17 +537,17 @@ bool Spieler::addItem( GegenstandTyp typ, int anz, Spiel *zSpiel )
     else
     {
         zSpiel->setItemZuletztAufgehoben( typ );
-        zSpiel->setSpielerZuletztGegenstandAufgehoben( (Spieler *)getThis() );
+        zSpiel->setSpielerZuletztGegenstandAufgehoben( dynamic_cast<Spieler *>( getThis() ) );
         itemsAufgehoben += anz;
         Ereignis *e = new Ereignis( SPIELER_BEKOMMT_GEGENSTAND );
-        e->addParameter( "Betroffener Spieler", getThis() );
+        e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
         e->addParameter( "Betroffener Gegenstand", new GegenstandTypVar( typ ) );
         e->addParameter( "Anzahl", new Integer( anz ) );
         zSpiel->throwEvent( e );
         for( int i = 0; i < anz; i++ )
         {
             Ereignis *e = new Ereignis( SPIELER_BENUTZT_GEGENSTAND );
-            e->addParameter( "Betroffener Spieler", getThis() );
+            e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
             e->addParameter( "Betroffener Gegenstand", new GegenstandTypVar( typ ) );
             zSpiel->throwEvent( e );
             itemsVerwendet++;
@@ -579,11 +579,11 @@ bool Spieler::addItem( GegenstandTyp typ, int anz, Spiel *zSpiel )
 // heilt auch um den lebensraub prozentsatz
 void Spieler::addGemachterSchaden( float schaden, Spiel *zSpiel )
 {
-    zSpiel->setSpielerZuletztSchadenGemacht( (Spieler *)getThis() );
+    zSpiel->setSpielerZuletztSchadenGemacht( dynamic_cast<Spieler *>( getThis() ) );
     schadenGemacht += schaden;
     heilung( schaden / 100 * lebensraub, zSpiel );
     Ereignis *e = new Ereignis( SPIELER_MACHT_SCHADEN );
-    e->addParameter( "Betroffener Spieler", getThis() );
+    e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
     e->addParameter( "Wert", new Float( schaden ) );
     zSpiel->throwEvent( e );
 }
@@ -599,11 +599,11 @@ void Spieler::nimmSchaden( float schaden, Spieler *zVerursacher, Richtung r, Spi
     schaden = leben < schaden ? leben : schaden;
     schadenGenommen += schaden;
     leben -= schaden;
-    zSpiel->setSpielerZuletztSchadenGenommen( (Spieler *)getThis() );
+    zSpiel->setSpielerZuletztSchadenGenommen( dynamic_cast<Spieler *>( getThis() ) );
     if( zVerursacher )
         zVerursacher->addGemachterSchaden( schaden, zSpiel );
     Ereignis *e = new Ereignis( SPIELER_NIMMT_SCHADEN );
-    e->addParameter( "Betroffener Spieler", getThis() );
+    e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
     e->addParameter( "Wert", new Float( schaden ) );
     zSpiel->throwEvent( e );
     if( leben == 0 )
@@ -613,11 +613,11 @@ void Spieler::nimmSchaden( float schaden, Spieler *zVerursacher, Richtung r, Spi
         team->addTod();
         amLeben = 0;
         tode++;
-        zSpiel->setSpielerZuletztGestorben( (Spieler *)getThis() );
+        zSpiel->setSpielerZuletztGestorben( dynamic_cast<Spieler *>( getThis() ) );
         if( zVerursacher )
             zVerursacher->addKill();
         Ereignis *e = new Ereignis( SPIELER_STIRBT );
-        e->addParameter( "Betroffener Spieler", getThis() );
+        e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
         zSpiel->throwEvent( e );
     }
 }
@@ -629,9 +629,9 @@ void Spieler::heilung( float heal, Spiel *zSpiel )
         heal = heal + leben > (float)maxLeben ? (float)maxLeben - leben : heal;
         lebenGeheilt += heal;
         leben += heal;
-        zSpiel->setSpielerZuletztGeheilt( (Spieler *)getThis() );
+        zSpiel->setSpielerZuletztGeheilt( dynamic_cast<Spieler *>( getThis() ) );
         Ereignis *e = new Ereignis( SPIELER_WIRD_GEHEILT );
-        e->addParameter( "Betroffener Spieler", getThis() );
+        e->addParameter( "Betroffener Spieler", dynamic_cast<Spieler *>( getThis() ) );
         e->addParameter( "Wert", new Float( heal ) );
         zSpiel->throwEvent( e );
     }
@@ -760,7 +760,7 @@ Team *Spieler::zTeam() const
 
 Team *Spieler::getTeam() const
 {
-    return team ? (Team *)team->getThis() : 0;
+    return team ? dynamic_cast<Team *>( team->getThis() ) : 0;
 }
 
 int Spieler::getFarbe() const

+ 1 - 16
StickmanWorldOnline/Statistik.cpp

@@ -12,6 +12,7 @@
 // Inhalt der Statistik Klasse aus Statistik.h
 // Konstruktor
 Statistik::Statistik()
+    : ReferenceCounter()
 {
     spielId = 0;
     karteId = 0;
@@ -22,7 +23,6 @@ Statistik::Statistik()
     sOnline = new Array< bool >();
     sBereit = new Array< bool >();
     gewinnerTeam = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -172,19 +172,4 @@ void Statistik::run()
         if( !online )
             break;
     }
-}
-
-// Reference Counting
-StatistikV *Statistik::getThis()
-{
-    ref++;
-    return this;
-}
-
-StatistikV *Statistik::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 0 - 4
StickmanWorldOnline/Statistik.h

@@ -17,7 +17,6 @@ private:
     Array< bool > *sOnline;
     Array< bool > *sBereit;
     int gewinnerTeam;
-    int ref;
 
     void sendeStatistik( int index );
 
@@ -36,7 +35,4 @@ public:
     virtual void klientOffline( int accountId );
     virtual void statistikAnfrage( int accountId, short len, char *bytes );
     virtual void run();
-    // Reference Counting
-    virtual StatistikV *getThis();
-    virtual StatistikV *release();
 };

+ 1 - 6
StickmanWorldOnline/StatistikKlasse.h

@@ -1,6 +1,6 @@
 #pragma once
 
-class StatistikV
+class StatistikV : public virtual ReferenceCounter
 {
 private:
 
@@ -11,9 +11,4 @@ public:
     virtual void klientOffline( int accountId ) = 0;
     virtual void statistikAnfrage( int accountId, short len, char *bytes ) = 0;
     virtual void run() = 0;
-    // constant
-
-    // Reference Counting
-    virtual StatistikV *getThis() = 0;
-    virtual StatistikV *release() = 0;
 };

+ 2 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj

@@ -169,11 +169,13 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Link>
       <UnresolvedSymbolReferences>false</UnresolvedSymbolReferences>
+      <OutputFile>$(RemoteRootDir)/Spiele/StickmanWorldOnline/debug/$(TargetName)$(TargetExt)</OutputFile>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Link>
       <UnresolvedSymbolReferences>false</UnresolvedSymbolReferences>
+      <OutputFile>$(RemoteRootDir)/Spiele/StickmanWorldOnline/debug/$(TargetName)$(TargetExt)</OutputFile>
     </Link>
   </ItemDefinitionGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+ 6 - 6
StickmanWorldOnline/Timer.cpp

@@ -22,18 +22,18 @@ void Timer::start( Spiel *zSpiel, bool restart )
     currentTime = (float)maxZeit;
     runns = true;
     pause = 0;
-    zSpiel->setTimerZuletztGestartet( (Timer *)getThis() );
+    zSpiel->setTimerZuletztGestartet( dynamic_cast<Timer *>( getThis() ) );
     Ereignis *e = new Ereignis( TIMER_BEGINNT );
-    e->addParameter( "Betroffener Timer", this->getThis() );
+    e->addParameter( "Betroffener Timer", dynamic_cast<Timer *>( this->getThis() ) );
     zSpiel->throwEvent( e );
 }
 
 void Timer::setPause( Spiel *zSpiel, bool pause )
 {
     if( pause && !this->pause )
-        zSpiel->setTimerZuletztPausiert( (Timer *)getThis() );
+        zSpiel->setTimerZuletztPausiert( dynamic_cast<Timer *>( getThis() ) );
     if( !pause && this->pause )
-        zSpiel->setTimerZuletztFortgesetzt( (Timer *)getThis() );
+        zSpiel->setTimerZuletztFortgesetzt( dynamic_cast<Timer *>( getThis() ) );
     this->pause = pause;
 }
 
@@ -64,10 +64,10 @@ void Timer::tick( double time, Spiel *zSpiel )
         currentTime -= (float)time;
         if( currentTime <= 0 )
         {
-            zSpiel->setTimerZuletztAbgelaufen( (Timer *)getThis() );
+            zSpiel->setTimerZuletztAbgelaufen( dynamic_cast<Timer *>( getThis() ) );
             runns = 0;
             Ereignis *e = new Ereignis( TIMER_RUNNS_OUT );
-            e->addParameter( "Betroffener Timer", this->getThis() );
+            e->addParameter( "Betroffener Timer", dynamic_cast<Timer *>( this->getThis() ) );
             zSpiel->throwEvent( e );
             if( autoWiederhohlung )
                 start( zSpiel );

+ 9 - 75
StickmanWorldOnline/Trigger.cpp

@@ -3,10 +3,10 @@
 
 
 VarPointer::VarPointer( const char *name, Variable *var )
+    : ReferenceCounter()
 {
     this->name = name;
     this->var = var;
-    ref = 1;
 }
 
 VarPointer::~VarPointer()
@@ -29,7 +29,7 @@ void VarPointer::setVariable( Variable *var )
 
 Variable *VarPointer::getVariable() const
 {
-    return var ? var->getThis() : 0;
+    return var ? dynamic_cast<Variable *>( var->getThis() ) : 0;
 }
 
 Variable *VarPointer::zVariable() const
@@ -42,24 +42,10 @@ VarPointer::operator Variable *( ) const
     return var;
 }
 
-VarPointer *VarPointer::getThis()
-{
-    ref++;
-    return this;
-}
-
-VarPointer *VarPointer::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 LocalMemory::LocalMemory()
-{
-    ref = 1;
-}
+    : ReferenceCounter()
+{}
 
 LocalMemory::~LocalMemory()
 {}
@@ -97,25 +83,12 @@ Variable *LocalMemory::zVariable( const char *name )
     return 0;
 }
 
-LocalMemory *LocalMemory::getThis()
-{
-    ref++;
-    return this;
-}
-
-LocalMemory *LocalMemory::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 ProgramCounter::ProgramCounter()
+    : ReferenceCounter()
 {
     current.add( 0 );
     depth = 0;
-    ref = 1;
 }
 
 ProgramCounter::~ProgramCounter()
@@ -153,24 +126,11 @@ int ProgramCounter::currentPosition() const
     return current.get( depth );
 }
 
-ProgramCounter *ProgramCounter::getThis()
-{
-    ref++;
-    return this;
-}
-
-ProgramCounter *ProgramCounter::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 Bedingung::Bedingung( Aktion *expression )
+    : ReferenceCounter()
 {
     this->expression = expression;
-    ref = 1;
 }
 
 Bedingung::~Bedingung()
@@ -199,19 +159,6 @@ bool Bedingung::check( Spiel *zSpiel, Ereignis *zEreignis )
     return isTrue( var );
 }
 
-Bedingung *Bedingung::getThis()
-{
-    ref++;
-    return this;
-}
-
-Bedingung *Bedingung::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 Trigger::Trigger( int id, const char *name, int ereignisAnzahl, EreignisTyp *ereignisse, RCArray< Bedingung > *bedingungen, RCArray< Aktion > *aktionen )
     : Variable( TRIGGER )
@@ -280,7 +227,7 @@ TriggerRun *Trigger::runTrigger( Ereignis *e, Spiel *zSpiel )
         }
     }
     runCount++;
-    return new TriggerRun( (Trigger *)getThis(), e, zSpiel );
+    return new TriggerRun( dynamic_cast<Trigger *>( getThis() ), e, zSpiel );
 }
 
 int Trigger::getId() const
@@ -305,12 +252,12 @@ bool Trigger::istAktiv() const
 
 
 TriggerRun::TriggerRun( Trigger *trig, Ereignis *e, Spiel *zSpiel )
+    : ReferenceCounter()
 {
     trigger = trig;
     ereignis = e;
     this->zSpiel = zSpiel;
     waitCount = 0;
-    ref = 1;
 }
 
 TriggerRun::~TriggerRun()
@@ -340,18 +287,5 @@ bool TriggerRun::runNext( double t )
 
 Trigger *TriggerRun::getTrigger() const
 {
-    return (Trigger *)trigger->getThis();
-}
-
-TriggerRun *TriggerRun::getThis()
-{
-    ref++;
-    return this;
-}
-
-TriggerRun *TriggerRun::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
+    return dynamic_cast<Trigger *>( trigger->getThis() );
 }

+ 5 - 20
StickmanWorldOnline/Trigger.h

@@ -9,12 +9,11 @@ using namespace Framework;
 class TriggerRun;
 class Spiel;
 
-class VarPointer
+class VarPointer : public virtual ReferenceCounter
 {
 private:
     Variable *var;
     Text name;
-    int ref;
 
 public:
     VarPointer( const char *name, Variable *var );
@@ -24,15 +23,12 @@ public:
     Variable *getVariable() const;
     Variable *zVariable() const;
     operator Variable *( ) const;
-    VarPointer *getThis();
-    VarPointer *release();
 };
 
-class LocalMemory
+class LocalMemory : public virtual ReferenceCounter
 {
 private:
     RCArray< VarPointer > vars;
-    int ref;
 
 public:
     LocalMemory();
@@ -40,16 +36,13 @@ public:
     void setVar( const char *name, Variable *var );
     Variable *getVariable( const char *name );
     Variable *zVariable( const char *name );
-    LocalMemory *getThis();
-    LocalMemory *release();
 };
 
-class ProgramCounter
+class ProgramCounter : public virtual ReferenceCounter
 {
 private:
     Array< int > current;
     int depth;
-    int ref;
 
 public:
     ProgramCounter();
@@ -59,23 +52,18 @@ public:
     void stepOut();
     Text getUniqueString() const;
     int currentPosition() const;
-    ProgramCounter *getThis();
-    ProgramCounter *release();
 };
 
-class Bedingung
+class Bedingung : public virtual ReferenceCounter
 {
 private:
     Aktion *expression;
-    int ref;
 
 public:
     Bedingung( Aktion *expression );
     ~Bedingung();
     void setExpression( Aktion *expr );
     bool check( Spiel *zSpiel, Ereignis *zEreignis );
-    Bedingung *getThis();
-    Bedingung *release();
 };
 
 class Trigger : public Variable
@@ -106,7 +94,7 @@ public:
     bool istAktiv() const;
 };
 
-class TriggerRun
+class TriggerRun : public virtual ReferenceCounter
 {
 private:
     Trigger *trigger;
@@ -116,7 +104,6 @@ private:
     ProgramCounter counter;
     int programCounter;
     double waitCount;
-    int ref;
 
 public:
     TriggerRun( Trigger *trig, Ereignis *e, Spiel *zSpiel );
@@ -124,6 +111,4 @@ public:
     // gibt 0 zurück, wenn der Auslöser vollständig durchgelaufen ist
     bool runNext( double t );
     Trigger *getTrigger() const;
-    TriggerRun *getThis();
-    TriggerRun *release();
 };

+ 1 - 1
StickmanWorldOnline/Tunnel.cpp

@@ -24,7 +24,7 @@ void Tunnel::setZielY( int y )
 
 void Tunnel::addBenutzung( Spiel *zSpiel )
 {
-    zSpiel->setTunnelZuletztBenutzt( (Tunnel *)getThis() );
+    zSpiel->setTunnelZuletztBenutzt( dynamic_cast<Tunnel *>( getThis() ) );
     benutzt++;
 }
 

+ 1 - 1
StickmanWorldOnline/Umlenkung.cpp

@@ -58,7 +58,7 @@ void Umlenkung::addBenutzt( Spiel *zSpiel )
         }
     }
     abklingzeitVerbleibend = (float)maxAbklingzeit;
-    zSpiel->setUmlenkungZuletztBenutzt( (Umlenkung *)getThis() );
+    zSpiel->setUmlenkungZuletztBenutzt( dynamic_cast<Umlenkung *>( getThis() ) );
 }
 
 void Umlenkung::tick( double time )

+ 4 - 17
StickmanWorldOnline/Variablen.cpp

@@ -53,9 +53,9 @@ bool operator==( VariableTyp a, VariableTyp b )
         return ( a == (int)BARIERE || a == (int)BASE || a == (int)GEGENSTAND || a == (int)GESCHOSS ||
                  a == (int)SCHALTER || a == (int)SCHIENE || a == (int)SPIELER || a == (int)TIMER ||
                  a == (int)TUNNEL || a == (int)UMLENKUNG || a == (int)GAME_OBJEKT || a == (int)ALLE ) &&
-                 ( b == (int)BARIERE || b == (int)BASE || b == (int)GEGENSTAND || b == (int)GESCHOSS ||
-                   b == (int)SCHALTER || b == (int)SCHIENE || b == (int)SPIELER || b == (int)TIMER || b == (int)TUNNEL ||
-                   b == (int)UMLENKUNG || b == (int)GAME_OBJEKT || b == (int)ALLE );
+            ( b == (int)BARIERE || b == (int)BASE || b == (int)GEGENSTAND || b == (int)GESCHOSS ||
+              b == (int)SCHALTER || b == (int)SCHIENE || b == (int)SPIELER || b == (int)TIMER || b == (int)TUNNEL ||
+              b == (int)UMLENKUNG || b == (int)GAME_OBJEKT || b == (int)ALLE );
     }
     return (int)a == (int)b;
 }
@@ -67,9 +67,9 @@ bool operator!=( VariableTyp a, VariableTyp b )
 
 
 Variable::Variable( VariableTyp typ )
+    : ReferenceCounter()
 {
     this->typ = typ;
-    ref = 1;
 }
 
 Variable::~Variable()
@@ -80,19 +80,6 @@ VariableTyp Variable::getVariableTyp() const
     return typ;
 }
 
-Variable *Variable::getThis()
-{
-    ref++;
-    return this;
-}
-
-Variable *Variable::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 bool isTrue( Variable *v )
 {
     if( !v )

+ 1 - 4
StickmanWorldOnline/Variablen.h

@@ -86,18 +86,15 @@ enum GegenstandTyp
 bool operator==( VariableTyp a, VariableTyp b );
 bool operator!=( VariableTyp a, VariableTyp b );
 
-class Variable
+class Variable : public virtual ReferenceCounter
 {
 private:
     VariableTyp typ;
-    int ref;
 
 public:
     Variable( VariableTyp typ );
     virtual ~Variable();
     VariableTyp getVariableTyp() const;
-    Variable *getThis();
-    Variable *release();
 };
 
 bool isTrue( Variable *v );