Переглянути джерело

Ids werden in der map gespeichert um objekte besser referenzieren zu können

Kolja Strohm 5 роки тому
батько
коміт
cee22c649a

+ 5 - 0
StickmanWorldOnline/Geschoss.cpp

@@ -200,6 +200,11 @@ bool Geschoss::intersectsWith( GameObject *zObj )
     return GameObject::intersectsWith( zObj );
 }
 
+int Geschoss::getId() const
+{
+    return id;
+}
+
 GeschossTyp Geschoss::getTyp() const
 {
     return typ;

+ 1 - 0
StickmanWorldOnline/Geschoss.h

@@ -39,6 +39,7 @@ public:
     void setRichtung( Richtung r );
     void tick( double zeit );
     bool intersectsWith( GameObject *zObj ) override;
+    int getId() const;
     GeschossTyp getTyp() const;
     Spieler *zBesitzer() const;
     Spieler *getBesitzer() const;

+ 164 - 139
StickmanWorldOnline/Reader.cpp

@@ -717,6 +717,8 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         int verschiebungWeite;
         int autoSchaltungMaxTime;
         int team;
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& x, 4 );
         mapFile.lese( (char *)& y, 4 );
         mapFile.lese( (char *)& breite, 4 );
@@ -725,7 +727,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         mapFile.lese( (char *)& verschiebungWeite, 4 );
         mapFile.lese( (char *)& autoSchaltungMaxTime, 4 );
         mapFile.lese( (char *)& team, 4 );
-        zSpiel->addBariere( new Bariere( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, style, verschiebungWeite, autoSchaltungMaxTime, zSpiel->getTeam( team ) ) );
+        zSpiel->addBariere( new Bariere( zSpiel->zResources(), id, x, y, breite, height, style, verschiebungWeite, autoSchaltungMaxTime, zSpiel->getTeam( team ) ) );
     }
     // Basen
     mapFile.lese( (char *)& anz, 4 );
@@ -737,13 +739,15 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         int height;
         int maxTime;
         int team;
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& x, 4 );
         mapFile.lese( (char *)& y, 4 );
         mapFile.lese( (char *)& breite, 4 );
         mapFile.lese( (char *)& height, 4 );
         mapFile.lese( (char *)& maxTime, 4 );
         mapFile.lese( (char *)& team, 4 );
-        zSpiel->addBase( new Base( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, maxTime, zSpiel->getTeam( team ) ) );
+        zSpiel->addBase( new Base( zSpiel->zResources(), id, x, y, breite, height, maxTime, zSpiel->getTeam( team ) ) );
     }
     // Drops
     mapFile.lese( (char *)& anz, 4 );
@@ -756,6 +760,8 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         int maxTime;
         int numDrops;
         float wahrscheinlichkeit[ ITEMANZAHL ];
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& minX, 4 );
         mapFile.lese( (char *)& minY, 4 );
         mapFile.lese( (char *)& maxX, 4 );
@@ -769,7 +775,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         char *name = new char[ (int)len + 1 ];
         mapFile.lese( name, len );
         name[ (int)len ] = 0;
-        zSpiel->addDrop( new Drop( zSpiel->getNextId(), minX, maxX, minY, maxY, maxTime, numDrops, name, wahrscheinlichkeit ) );
+        zSpiel->addDrop( new Drop( id, minX, maxX, minY, maxY, maxTime, numDrops, name, wahrscheinlichkeit ) );
         delete[] name;
     }
     // Schalter
@@ -781,12 +787,14 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         int breite;
         int height;
         bool aktive;
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& x, 4 );
         mapFile.lese( (char *)& y, 4 );
         mapFile.lese( (char *)& breite, 4 );
         mapFile.lese( (char *)& height, 4 );
         mapFile.lese( (char *)& aktive, 1 );
-        zSpiel->addSchalter( new Schalter( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, aktive ) );
+        zSpiel->addSchalter( new Schalter( zSpiel->zResources(), id, x, y, breite, height, aktive ) );
     }
     // Schiene
     mapFile.lese( (char *)& anz, 4 );
@@ -796,11 +804,13 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         int y;
         int breite;
         int height;
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& x, 4 );
         mapFile.lese( (char *)& y, 4 );
         mapFile.lese( (char *)& breite, 4 );
         mapFile.lese( (char *)& height, 4 );
-        zSpiel->addSchiene( new Schiene( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height ) );
+        zSpiel->addSchiene( new Schiene( zSpiel->zResources(), id, x, y, breite, height ) );
     }
     // Timer
     mapFile.lese( (char *)& anz, 4 );
@@ -813,6 +823,8 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         bool autoWiederhohlung;
         bool runns;
         int farbe;
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& x, 4 );
         mapFile.lese( (char *)& y, 4 );
         mapFile.lese( (char *)& maxZeit, 4 );
@@ -825,7 +837,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         char *name = new char[ (int)len + 1 ];
         mapFile.lese( name, len );
         name[ (int)len ] = 0;
-        zSpiel->addTimer( new Timer( zSpiel->zResources()->zSchrift(), zSpiel->getNextId(), name, maxZeit, x, y, sichtbar, autoWiederhohlung, runns, farbe ) );
+        zSpiel->addTimer( new Timer( zSpiel->zResources()->zSchrift(), id, name, maxZeit, x, y, sichtbar, autoWiederhohlung, runns, farbe ) );
         delete[] name;
     }
     // Tunnel
@@ -839,6 +851,8 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         int zielX;
         int zielY;
         bool aktiv;
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& x, 4 );
         mapFile.lese( (char *)& y, 4 );
         mapFile.lese( (char *)& breite, 4 );
@@ -846,7 +860,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         mapFile.lese( (char *)& zielX, 4 );
         mapFile.lese( (char *)& zielY, 4 );
         mapFile.lese( (char *)& aktiv, 1 );
-        zSpiel->addTunnel( new Tunnel( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, zielX, zielY, aktiv ) );
+        zSpiel->addTunnel( new Tunnel( zSpiel->zResources(), id, x, y, breite, height, zielX, zielY, aktiv ) );
     }
     // Umlenkungen
     mapFile.lese( (char *)& anz, 4 );
@@ -860,6 +874,8 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         int maxAbklingzeit;
         bool drehend;
         bool aktiv;
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& x, 4 );
         mapFile.lese( (char *)& y, 4 );
         mapFile.lese( (char *)& breite, 4 );
@@ -868,12 +884,14 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         mapFile.lese( (char *)& maxAbklingzeit, 4 );
         mapFile.lese( (char *)& drehend, 1 );
         mapFile.lese( (char *)& aktiv, 1 );
-        zSpiel->addUmlenkung( new Umlenkung( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, (Richtung)richtung, maxAbklingzeit, drehend, aktiv ) );
+        zSpiel->addUmlenkung( new Umlenkung( zSpiel->zResources(), id, x, y, breite, height, (Richtung)richtung, maxAbklingzeit, drehend, aktiv ) );
     }
     // Trigger
     mapFile.lese( (char *)& anz, 4 );
     for( int i = 0; i < anz; i++ )
     {
+        int id;
+        mapFile.lese( (char *)& id, 4 );
         char len;
         mapFile.lese( (char *)& len, 1 );
         char *name = new char[ (int)len + 1 ];
@@ -894,7 +912,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         RCArray< Aktion > *aktionen = new RCArray< Aktion >();
         for( int j = 0; j < aktionAnzahl; j++ )
             aktionen->add( readAktion( mapFile ) );
-        zSpiel->addTrigger( new Trigger( zSpiel->getNextId(), name, ereignisAnzahl, ereignisse, bedingungen, aktionen ) );
+        zSpiel->addTrigger( new Trigger( id, name, ereignisAnzahl, ereignisse, bedingungen, aktionen ) );
         delete[] name;
     }
     // Variablen
@@ -908,139 +926,146 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         name[ (int)len ] = 0;
         char typ;
         mapFile.lese( &typ, 1 );
+        char def;
+        mapFile.lese( &def, 1 );
         Variable *var = 0;
-        switch( typ )
-        {
-        case NICHTS:
+        if( !def )
             var = new Variable( NICHTS );
-            break;
-        case INTEGER:
-        {
-            int val;
-            mapFile.lese( (char *)& val, 4 );
-            var = new Integer( val );
-            break;
-        }
-        case BOOLEAN:
-        {
-            bool val;
-            mapFile.lese( (char *)& val, 1 );
-            var = new Boolean( val );
-            break;
-        }
-        case STRING:
-        {
-            char len;
-            mapFile.lese( (char *)& len, 1 );
-            char *value = new char[ (int)len + 1 ];
-            mapFile.lese( value, len );
-            value[ (int)len ] = 0;
-            var = new String( value );
-            delete[] value;
-            break;
-        }
-        case RICHTUNG:
-        {
-            char len;
-            mapFile.lese( (char *)& len, 1 );
-            char *value = new char[ (int)len + 1 ];
-            mapFile.lese( value, len );
-            value[ (int)len ] = 0;
-            var = new String( getRichtungFromString( Text( value ) ) );
-            delete[] value;
-            break;
-        }
-        case FLOAT:
-        {
-            float val;
-            mapFile.lese( (char *)& val, 4 );
-            var = new Float( val );
-            break;
-        }
-        case TASTE:
-        {
-            char val;
-            mapFile.lese( &val, 1 );
-            var = new Integer( val, 1 );
-            break;
-        }
-        case SPIELER:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getSpieler( id );
-            break;
-        }
-        case TIMER:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getTimer( id );
-            break;
-        }
-        case TEAM:
+        else
         {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getTeam( id );
-            break;
-        }
-        case BARIERE:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getBariere( id );
-            break;
-        }
-        case SCHALTER:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getSchalter( id );
-            break;
-        }
-        case BASE:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getBase( id );
-            break;
-        }
-        case GEGENSTAND:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = new GegenstandTypVar( (GegenstandTyp)id );
-            break;
-        }
-        case SCHIENE:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getSchiene( id );
-            break;
-        }
-        case TUNNEL:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getTunnel( id );
-            break;
-        }
-        case UMLENKUNG:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getUmlenkung( id );
-            break;
-        }
-        case TRIGGER:
-        {
-            int id;
-            mapFile.lese( (char *)& id, 4 );
-            var = zSpiel->getTrigger( id );
-            break;
-        }
+            switch( typ )
+            {
+            case NICHTS:
+                var = new Variable( NICHTS );
+                break;
+            case INTEGER:
+            {
+                int val;
+                mapFile.lese( (char *)& val, 4 );
+                var = new Integer( val );
+                break;
+            }
+            case BOOLEAN:
+            {
+                bool val;
+                mapFile.lese( (char *)& val, 1 );
+                var = new Boolean( val );
+                break;
+            }
+            case STRING:
+            {
+                char len;
+                mapFile.lese( (char *)& len, 1 );
+                char *value = new char[ (int)len + 1 ];
+                mapFile.lese( value, len );
+                value[ (int)len ] = 0;
+                var = new String( value );
+                delete[] value;
+                break;
+            }
+            case RICHTUNG:
+            {
+                char len;
+                mapFile.lese( (char *)& len, 1 );
+                char *value = new char[ (int)len + 1 ];
+                mapFile.lese( value, len );
+                value[ (int)len ] = 0;
+                var = new String( getRichtungFromString( Text( value ) ) );
+                delete[] value;
+                break;
+            }
+            case FLOAT:
+            {
+                float val;
+                mapFile.lese( (char *)& val, 4 );
+                var = new Float( val );
+                break;
+            }
+            case TASTE:
+            {
+                char val;
+                mapFile.lese( &val, 1 );
+                var = new Integer( val, 1 );
+                break;
+            }
+            case SPIELER:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getSpieler( id );
+                break;
+            }
+            case TIMER:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getTimer( id );
+                break;
+            }
+            case TEAM:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getTeam( id );
+                break;
+            }
+            case BARIERE:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getBariere( id );
+                break;
+            }
+            case SCHALTER:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getSchalter( id );
+                break;
+            }
+            case BASE:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getBase( id );
+                break;
+            }
+            case GEGENSTAND:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = new GegenstandTypVar( (GegenstandTyp)id );
+                break;
+            }
+            case SCHIENE:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getSchiene( id );
+                break;
+            }
+            case TUNNEL:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getTunnel( id );
+                break;
+            }
+            case UMLENKUNG:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getUmlenkung( id );
+                break;
+            }
+            case TRIGGER:
+            {
+                int id;
+                mapFile.lese( (char *)& id, 4 );
+                var = zSpiel->getTrigger( id );
+                break;
+            }
+            }
         }
         zSpiel->addVariable( name, var );
         delete[] name;

+ 11 - 0
StickmanWorldOnline/Spiel.cpp

@@ -947,21 +947,25 @@ void Spiel::addSpieler( Spieler *spieler )
 
 void Spiel::addBariere( Bariere *bariere )
 {
+    nextId = nextId > bariere->getId() ? nextId : bariere->getId() + 1;
     barieren.add( bariere );
 }
 
 void Spiel::addBase( Base *base )
 {
+    nextId = nextId > base->getId() ? nextId : base->getId() + 1;
     basen.add( base );
 }
 
 void Spiel::addDrop( Drop *drop )
 {
+    nextId = nextId > drop->getId() ? nextId : drop->getId() + 1;
     drops.add( drop );
 }
 
 void Spiel::addGegenstand( Gegenstand *gegenstand )
 {
+    nextId = nextId > gegenstand->getId() ? nextId : gegenstand->getId() + 1;
     items.add( gegenstand );
     zuletztGedropterGegenstand = gegenstand->getTyp();
     Ereignis *e = new Ereignis( GEGENSTAND_DROPED );
@@ -971,6 +975,7 @@ void Spiel::addGegenstand( Gegenstand *gegenstand )
 
 void Spiel::addGeschoss( Geschoss *geschoss )
 {
+    nextId = nextId > geschoss->getId() ? nextId : geschoss->getId() + 1;
     if( zuletztAbgefeuertesGeschoss )
         zuletztAbgefeuertesGeschoss->release();
     zuletztAbgefeuertesGeschoss = (Geschoss*)geschoss->getThis();
@@ -979,31 +984,37 @@ void Spiel::addGeschoss( Geschoss *geschoss )
 
 void Spiel::addSchalter( Schalter *schalter )
 {
+    nextId = nextId > schalter->getId() ? nextId : schalter->getId() + 1;
     this->schalter.add( schalter );
 }
 
 void Spiel::addSchiene( Schiene *schiene )
 {
+    nextId = nextId > schiene->getId() ? nextId : schiene->getId() + 1;
     schienen.add( schiene );
 }
 
 void Spiel::addTimer( Timer *timer )
 {
+    nextId = nextId > timer->getId() ? nextId : timer->getId() + 1;
     this->timer.add( timer );
 }
 
 void Spiel::addTunnel( Tunnel *tunnel )
 {
+    nextId = nextId > tunnel->getId() ? nextId : tunnel->getId() + 1;
     this->tunnel.add( tunnel );
 }
 
 void Spiel::addUmlenkung( Umlenkung *umlenkung )
 {
+    nextId = nextId > umlenkung->getId() ? nextId : umlenkung->getId() + 1;
     umlenkungen.add( umlenkung );
 }
 
 void Spiel::addTrigger( Trigger *trigger )
 {
+    nextId = nextId > trigger->getId() ? nextId : trigger->getId() + 1;
     this->trigger.add( trigger );
 }