Просмотр исходного кода

Fehlerhafte Zuweisung von Teams behoben und Editor zeigt Startpositionen der Spieler an

Kolja Strohm 5 лет назад
Родитель
Сommit
e41f591708

+ 26 - 1
Asteroids/Editor/Editor.cpp

@@ -4,6 +4,7 @@
 #include "Interface\Dialogs\Nachricht.h"
 #include <iostream>
 #include <Bild.h>
+#include <Globals.h>
 
 using namespace Editor;
 
@@ -58,9 +59,11 @@ void AsteroidsEditor::ladeKarte()
     klient->getSpielerTeamStruktur( sts );
     if( daten )
         daten->release();
-    daten = new KarteDaten( (EditorKlient *)klient->getThis() );
+    daten = new KarteDaten( (EditorKlient *)klient->getThis(), sts );
     i->setDaten( (KarteDaten *)daten->getThis() );
     minimap->setWelt( daten->getWelt(), 0 );
+    minimap->lookAtWorldPos( daten->zWelt()->getWorldInfo().size / 2 );
+    minimap->lookAtWorldArea( daten->zWelt()->getWorldInfo().size.x, daten->zWelt()->getWorldInfo().size.y );
     kamera->setWelt( daten->getWelt(), 1 );
 }
 
@@ -179,6 +182,28 @@ void AsteroidsEditor::doMausEreignis( MausEreignis & me )
             } );
         }
     }
+    if( !me.verarbeitet )
+    {
+        if( getMausStand( M_Links ) )
+        {
+            if( me.mx >= minimap->getX() && me.mx < minimap->getX() + minimap->getBreite() &&
+                me.my >= minimap->getY() && me.my <= minimap->getY() + minimap->getHeight() )
+            {
+                kamera->lookAtWorldPos( minimap->getWorldCoordinates( Punkt( me.mx - minimap->getX(), me.my - minimap->getY() ) ) );
+            }
+            else
+            {
+                if( me.id == ME_Bewegung )
+                    kamera->lookAtWorldPos( kamera->getWorldPosition() + maus - Punkt( me.mx, me.my ) );
+            }
+        }
+        if( me.id == ME_UScroll )
+            kamera->setZoom( kamera->getZoom() / 0.9f );
+        if( me.id == ME_DScroll )
+            kamera->setZoom( kamera->getZoom() / 1.1f );
+    }
+    maus.x = me.mx;
+    maus.y = me.my;
 }
 
 void AsteroidsEditor::doTastaturEreignis( TastaturEreignis & te )

+ 1 - 0
Asteroids/Editor/Editor.h

@@ -33,6 +33,7 @@ namespace Editor
         KarteDaten *daten;
         Kamera2D *kamera;
         Kamera2D *minimap;
+        Punkt maus;
         unsigned char alpha;
         bool rend;
         int ref;

+ 8 - 12
Asteroids/Editor/Interface/Dialogs/Frage.cpp

@@ -23,17 +23,17 @@ Frage::Frage( TextRenderer *zS, char *frage, char *left, char *right, std::funct
     setSize( br + 12, hö + 63 );
     setPosition( maxSize / 2 - getSize() / 2 );
     
-    this->text = initTextFeld( 5, 5, br, hö, zS->zSchrift(), TextFeld::Style::Text, tmp->getText() );
+    TextFeld *text = initTextFeld( 5, 5, br, hö, zS->zSchrift(), TextFeld::Style::Text, tmp->getText() );
     addMember( text );
     tmp->release();
-    this->right = initKnopf( br - 94, hö + 22, 100, 20, zS->zSchrift(), Knopf::Style::Normal, right );
-    addMember( this->right );
-    this->left = initKnopf( br - 199, hö + 22, 100, 20, zS->zSchrift(), Knopf::Style::Normal, left );
-    addMember( this->left );
+    Knopf *r = initKnopf( br - 94, hö + 22, 100, 20, zS->zSchrift(), Knopf::Style::Normal, right );
+    addMember( r );
+    Knopf *l = initKnopf( br - 199, hö + 22, 100, 20, zS->zSchrift(), Knopf::Style::Normal, left );
+    addMember( l );
 
     bool *verl = &verlassen;
 
-    this->right->setMausEreignis( [ verl, rightAk ]( void *param, void *obj, MausEreignis me ) -> bool
+    r->setMausEreignis( [ verl, rightAk ]( void *param, void *obj, MausEreignis me ) -> bool
     {
         if( me.id == ME_RLinks && !me.verarbeitet && !*verl )
         {
@@ -43,7 +43,7 @@ Frage::Frage( TextRenderer *zS, char *frage, char *left, char *right, std::funct
         }
         return 1;
     } );
-    this->left->setMausEreignis( [ verl, leftAk ]( void *param, void *obj, MausEreignis me ) -> bool
+    l->setMausEreignis( [ verl, leftAk ]( void *param, void *obj, MausEreignis me ) -> bool
     {
         if( me.id == ME_RLinks && !me.verarbeitet && !*verl )
         {
@@ -66,8 +66,4 @@ Frage::Frage( TextRenderer *zS, char *frage, char *left, char *right, std::funct
 }
 
 Frage::~Frage()
-{
-    text->release();
-    left->release();
-    right->release();
-}
+{}

+ 0 - 5
Asteroids/Editor/Interface/Dialogs/Frage.h

@@ -5,11 +5,6 @@
 
 class Frage : public Dialog
 {
-private:
-    TextFeld *text;
-    Knopf *right;
-    Knopf *left;
-
 public:
     // Konstructor
     //  zS: Ein Zeiger auf die zu verwendende Schrift

+ 58 - 7
Asteroids/Editor/Karte/EditorKarte.cpp

@@ -1,16 +1,59 @@
 #include "EditorKarte.h"
+#include <Model2D.h>
+#include <Bild.h>
+#include <Textur2D.h>
 
 using namespace Editor;
 
-KarteDaten::KarteDaten( EditorKlient *client )
+KarteDaten::KarteDaten( EditorKlient *client, SpielerTeamStruktur *sts )
     : Thread()
 {
     welt = new Welt2D();
+    welt->setCircular( 1 );
     this->client = client;
-    sts = new SpielerTeamStruktur();
+    this->sts = (SpielerTeamStruktur *)sts->getThis();
+    client->loadMapSize( size );
+    client->loadResources( resources );
     client->loadSpieler( spieler );
     client->loadTeams( teams );
     client->loadObjekte( objekte );
+    welt->setSize( size.x, size.y );
+    welt->setSize( 1 );
+    for( auto s = spieler.getIterator(); s; s++ )
+    {
+        Model2DObject *model = new Model2DObject();
+        Bild *bild;
+        int fc = sts->spielerFarbe->get( s->id - 1 );
+        for( auto r = resources.getIterator(); r; r++ )
+        {
+            if( r->id == s->m2d )
+                model->setModel( client->loadModel( r->path ) );
+            if( r->id == s->bild )
+                bild = client->loadBild( r->path );
+        }
+        if( bild )
+        {
+            Bild *shb = new Bild();
+            shb->neuBild( bild->getBreite(), bild->getHeight(), 0 );
+            int maxP = shb->getBreite() * shb->getHeight();
+            int *buffer = bild->getBuffer();
+            for( int i = 0; i < maxP; i++ )
+            {
+                if( buffer[ i ] )
+                {
+                    shb->setPixelDP( i, fc );
+                    shb->alphaPixelDP2D( i, buffer[ i ] );
+                }
+            }
+            Textur2D *textur = new Textur2D();
+            textur->setTexturZ( shb );
+            model->setTextur( textur, "ship" );
+            bild->release();
+        }
+        model->setPosition( s->pos );
+        model->setCollision( 0 );
+        welt->addObject( model );
+    }
     exit = 0;
     start();
 }
@@ -18,6 +61,8 @@ KarteDaten::KarteDaten( EditorKlient *client )
 KarteDaten::~KarteDaten()
 {
     cs.lock();
+    for( auto i = resources.getIterator(); i; i++ )
+        delete i._;
     for( auto i = objekte.getIterator(); i; i++ )
         delete i._;
     for( auto i = spieler.getIterator(); i; i++ )
@@ -29,7 +74,7 @@ KarteDaten::~KarteDaten()
     welt->release();
 }
 
-void KarteDaten::addObjekt( ObjektDaten &daten )
+void KarteDaten::addObjekt( ObjektDaten & daten )
 {
     ObjektDaten *nd = new ObjektDaten( daten );
     cs.lock();
@@ -58,7 +103,7 @@ void KarteDaten::removeObjekt( int index )
     cs.unlock();
 }
 
-void KarteDaten::getObjekt( int index, std::function< bool( ObjektDaten* ) > callBack )
+void KarteDaten::getObjekt( int index, std::function< bool( ObjektDaten * ) > callBack )
 {
     cs.lock();
     if( callBack( objekte.get( index ) ) )
@@ -73,7 +118,7 @@ void KarteDaten::getObjekt( int index, std::function< bool( ObjektDaten* ) > cal
     cs.unlock();
 }
 
-void KarteDaten::getSpieler( int index, std::function< bool( SpielerDaten* ) > callBack )
+void KarteDaten::getSpieler( int index, std::function< bool( SpielerDaten * ) > callBack )
 {
     cs.lock();
     if( callBack( spieler.get( index ) ) )
@@ -88,14 +133,15 @@ void KarteDaten::getSpieler( int index, std::function< bool( SpielerDaten* ) > c
     cs.unlock();
 }
 
-void KarteDaten::getTeam( int index, std::function< bool( TeamDaten* ) > callBack )
+void KarteDaten::getTeam( int index, std::function< bool( TeamDaten * ) > callBack )
 {
     cs.lock();
     if( callBack( teams.get( index ) ) )
     {
         TeamDaten td = *teams.get( index );
         EditorKlient *c = client;
-        aktionen.add( [ td, c ](){
+        aktionen.add( [ td, c ]()
+        {
             c->saveTeam( &td );
         } );
     }
@@ -210,6 +256,11 @@ Welt2D *KarteDaten::getWelt() const
     return welt->getThis();
 }
 
+Welt2D *KarteDaten::zWelt() const
+{
+    return welt;
+}
+
 // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
 Thread *KarteDaten::release()
 {

+ 10 - 1
Asteroids/Editor/Karte/EditorKarte.h

@@ -9,6 +9,12 @@
 
 namespace Editor
 {
+    struct ResourceDaten
+    {
+        int id;
+        Text path;
+    };
+
     struct SpielerDaten : public Model
     {
         int id;
@@ -74,14 +80,16 @@ namespace Editor
         Array< SpielerDaten* > spieler;
         Array< TeamDaten* > teams;
         Array< ObjektDaten* > objekte;
+        Array< ResourceDaten * > resources;
         Text error;
         Array< std::function< void() > > aktionen;
         Critical cs;
         Welt2D *welt;
+        Punkt size;
         bool exit;
 
     public:
-        KarteDaten( EditorKlient *client );
+        KarteDaten( EditorKlient *client, SpielerTeamStruktur *sts );
         ~KarteDaten();
         void addObjekt( ObjektDaten &daten );
         void removeObjekt( int index );
@@ -101,6 +109,7 @@ namespace Editor
         char *getError() const;
         bool hasAktions() const;
         Welt2D *getWelt() const;
+        Welt2D *zWelt() const;
         // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
         Thread *release() override;
     };

+ 281 - 112
Asteroids/Editor/Netzwerk/EditorKlient.cpp

@@ -1,6 +1,8 @@
 #include "EditorKlient.h"
 #include <Klient.h>
 #include "../Karte/EditorKarte.h"
+#include <DateiSystem.h>
+#include <M2Datei.h>
 
 using namespace Network;
 using namespace Editor;
@@ -75,7 +77,7 @@ int EditorKlient::init()
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -103,7 +105,7 @@ bool EditorKlient::sitzungVerwerfen()
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -131,7 +133,7 @@ bool EditorKlient::sitzungBeenden()
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -157,27 +159,27 @@ bool EditorKlient::saveTeam( const TeamDaten *team )
     k->getNachrichtEncrypted( &ret, 1 );
     if( ret == 1 )
     {
-        k->sendeEncrypted( (char*)&team->id, 4 );
-        k->sendeEncrypted( (char*)&team->maxPunkte, 4 );
-        k->sendeEncrypted( (char*)&team->beschleunigung, 8 );
-        k->sendeEncrypted( (char*)&team->maxStabilität, 4 );
-        k->sendeEncrypted( (char*)&team->maxEnergie, 4 );
-        k->sendeEncrypted( (char*)&team->reparatur, 8 );
-        k->sendeEncrypted( (char*)&team->akkuLeistung, 8 );
-        k->sendeEncrypted( (char*)&team->laserIntensität, 4 );
-        k->sendeEncrypted( (char*)&team->laserEffizienz, 4 );
-        k->sendeEncrypted( (char*)&team->laserTempo, 4 );
-        k->sendeEncrypted( (char*)&team->wendigkeit, 8 );
-        k->sendeEncrypted( (char*)&team->antriebEffizienz, 8 );
-        k->sendeEncrypted( (char*)&team->energieSchild, 8 );
-        k->sendeEncrypted( (char*)&team->energieSchildEffizienz, 8 );
-        k->sendeEncrypted( (char*)&team->punkte, 4 );
+        k->sendeEncrypted( (char *)& team->id, 4 );
+        k->sendeEncrypted( (char *)& team->maxPunkte, 4 );
+        k->sendeEncrypted( (char *)& team->beschleunigung, 8 );
+        k->sendeEncrypted( (char *)& team->maxStabilität, 4 );
+        k->sendeEncrypted( (char *)& team->maxEnergie, 4 );
+        k->sendeEncrypted( (char *)& team->reparatur, 8 );
+        k->sendeEncrypted( (char *)& team->akkuLeistung, 8 );
+        k->sendeEncrypted( (char *)& team->laserIntensität, 4 );
+        k->sendeEncrypted( (char *)& team->laserEffizienz, 4 );
+        k->sendeEncrypted( (char *)& team->laserTempo, 4 );
+        k->sendeEncrypted( (char *)& team->wendigkeit, 8 );
+        k->sendeEncrypted( (char *)& team->antriebEffizienz, 8 );
+        k->sendeEncrypted( (char *)& team->energieSchild, 8 );
+        k->sendeEncrypted( (char *)& team->energieSchildEffizienz, 8 );
+        k->sendeEncrypted( (char *)& team->punkte, 4 );
         k->getNachrichtEncrypted( &ret, 1 );
     }
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -203,32 +205,32 @@ bool EditorKlient::saveSpieler( const SpielerDaten *spieler )
     k->getNachrichtEncrypted( &ret, 1 );
     if( ret == 1 )
     {
-        k->sendeEncrypted( (char*)&spieler->id, 4 );
-        k->sendeEncrypted( (char*)&spieler->pos.x, 4 );
-        k->sendeEncrypted( (char*)&spieler->pos.y, 4 );
-        k->sendeEncrypted( (char*)&spieler->rot, 8 );
-        k->sendeEncrypted( (char*)&spieler->beschleunigung, 8 );
-        k->sendeEncrypted( (char*)&spieler->maxStabilität, 4 );
-        k->sendeEncrypted( (char*)&spieler->maxEnergie, 4 );
-        k->sendeEncrypted( (char*)&spieler->reparatur, 8 );
-        k->sendeEncrypted( (char*)&spieler->akkuLeistung, 8 );
-        k->sendeEncrypted( (char*)&spieler->laserIntensität, 4 );
-        k->sendeEncrypted( (char*)&spieler->laserEffizienz, 4 );
-        k->sendeEncrypted( (char*)&spieler->laserTempo, 4 );
-        k->sendeEncrypted( (char*)&spieler->wendigkeit, 8 );
-        k->sendeEncrypted( (char*)&spieler->antriebEffizienz, 8 );
-        k->sendeEncrypted( (char*)&spieler->energieSchild, 8 );
-        k->sendeEncrypted( (char*)&spieler->energieSchildEffizienz, 8 );
-        k->sendeEncrypted( (char*)&spieler->netzwerk, 4 );
-        k->sendeEncrypted( (char*)&spieler->skillPunkte, 4 );
-        k->sendeEncrypted( (char*)&spieler->m2d, 4 );
-        k->sendeEncrypted( (char*)&spieler->bild, 4 );
+        k->sendeEncrypted( (char *)& spieler->id, 4 );
+        k->sendeEncrypted( (char *)& spieler->pos.x, 4 );
+        k->sendeEncrypted( (char *)& spieler->pos.y, 4 );
+        k->sendeEncrypted( (char *)& spieler->rot, 8 );
+        k->sendeEncrypted( (char *)& spieler->beschleunigung, 8 );
+        k->sendeEncrypted( (char *)& spieler->maxStabilität, 4 );
+        k->sendeEncrypted( (char *)& spieler->maxEnergie, 4 );
+        k->sendeEncrypted( (char *)& spieler->reparatur, 8 );
+        k->sendeEncrypted( (char *)& spieler->akkuLeistung, 8 );
+        k->sendeEncrypted( (char *)& spieler->laserIntensität, 4 );
+        k->sendeEncrypted( (char *)& spieler->laserEffizienz, 4 );
+        k->sendeEncrypted( (char *)& spieler->laserTempo, 4 );
+        k->sendeEncrypted( (char *)& spieler->wendigkeit, 8 );
+        k->sendeEncrypted( (char *)& spieler->antriebEffizienz, 8 );
+        k->sendeEncrypted( (char *)& spieler->energieSchild, 8 );
+        k->sendeEncrypted( (char *)& spieler->energieSchildEffizienz, 8 );
+        k->sendeEncrypted( (char *)& spieler->netzwerk, 4 );
+        k->sendeEncrypted( (char *)& spieler->skillPunkte, 4 );
+        k->sendeEncrypted( (char *)& spieler->m2d, 4 );
+        k->sendeEncrypted( (char *)& spieler->bild, 4 );
         k->getNachrichtEncrypted( &ret, 1 );
     }
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -254,24 +256,24 @@ bool EditorKlient::saveObjekt( const ObjektDaten *objekt )
     k->getNachrichtEncrypted( &ret, 1 );
     if( ret == 1 )
     {
-        k->sendeEncrypted( (char*)&objekt->pos.x, 4 );
-        k->sendeEncrypted( (char*)&objekt->pos.y, 4 );
-        k->sendeEncrypted( (char*)&objekt->id, 4 );
-        k->sendeEncrypted( (char*)&objekt->m2d, 4 );
-        k->sendeEncrypted( (char*)&objekt->bild, 4 );
-        k->sendeEncrypted( (char*)&objekt->style, 4 );
-        k->sendeEncrypted( (char*)&objekt->maxStabilität, 4 );
-        k->sendeEncrypted( (char*)&objekt->maxEnergie, 4 );
-        k->sendeEncrypted( (char*)&objekt->energieRadius, 4 );
-        k->sendeEncrypted( (char*)&objekt->reparatur, 8 );
-        k->sendeEncrypted( (char*)&objekt->akkuLeistung, 8 );
-        k->sendeEncrypted( (char*)&objekt->team, 1 );
+        k->sendeEncrypted( (char *)& objekt->pos.x, 4 );
+        k->sendeEncrypted( (char *)& objekt->pos.y, 4 );
+        k->sendeEncrypted( (char *)& objekt->id, 4 );
+        k->sendeEncrypted( (char *)& objekt->m2d, 4 );
+        k->sendeEncrypted( (char *)& objekt->bild, 4 );
+        k->sendeEncrypted( (char *)& objekt->style, 4 );
+        k->sendeEncrypted( (char *)& objekt->maxStabilität, 4 );
+        k->sendeEncrypted( (char *)& objekt->maxEnergie, 4 );
+        k->sendeEncrypted( (char *)& objekt->energieRadius, 4 );
+        k->sendeEncrypted( (char *)& objekt->reparatur, 8 );
+        k->sendeEncrypted( (char *)& objekt->akkuLeistung, 8 );
+        k->sendeEncrypted( (char *)& objekt->team, 1 );
         k->getNachrichtEncrypted( &ret, 1 );
     }
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -297,13 +299,13 @@ bool EditorKlient::deleteObjekt( int id )
     k->getNachrichtEncrypted( &ret, 1 );
     if( ret == 1 )
     {
-        k->sendeEncrypted( (char*)&id, 4 );
+        k->sendeEncrypted( (char *)& id, 4 );
         k->getNachrichtEncrypted( &ret, 1 );
     }
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -315,7 +317,52 @@ bool EditorKlient::deleteObjekt( int id )
     return ret == 1;
 }
 
-bool EditorKlient::loadSpieler( Array< SpielerDaten* > &spieler )
+bool EditorKlient::loadResources( Array< ResourceDaten * > &resources )
+{
+    Network::Klient *k = klient->beginEditorMessage();
+    if( !k )
+    {
+        error = klient->getLetzterFehler();
+        return 0;
+    }
+    error = "";
+    char ret;
+    k->sendeEncrypted( "\xA", 1 );
+    k->getNachrichtEncrypted( &ret, 1 );
+    if( ret == 1 )
+    {
+        int anz = 0;
+        k->getNachrichtEncrypted( (char *)& anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            ResourceDaten *resource = new ResourceDaten();
+            k->getNachrichtEncrypted( (char *)& resource->id, 4 );
+            char len = 0;
+            k->getNachrichtEncrypted( (char *)& len, 1 );
+            char *path = new char[ len + 1 ];
+            path[ len ] = 0;
+            k->getNachrichtEncrypted( path, len );
+            resource->path = path;
+            delete[] path;
+            resources.add( resource );
+        }
+    }
+    if( ret == 3 )
+    {
+        unsigned char l = 0;
+        k->getNachrichtEncrypted( (char *)& l, 1 );
+        char *err = new char[ l + 1 ];
+        err[ l ] = 0;
+        k->getNachrichtEncrypted( err, l );
+        error = err;
+        delete[] err;
+        ret = 0;
+    }
+    klient->endEditorMessage();
+    return ret == 1;
+}
+
+bool EditorKlient::loadSpieler( Array< SpielerDaten * > &spieler )
 {
     Network::Klient *k = klient->beginEditorMessage();
     if( !k )
@@ -330,37 +377,37 @@ bool EditorKlient::loadSpieler( Array< SpielerDaten* > &spieler )
     if( ret == 1 )
     {
         int anz = 0;
-        k->getNachrichtEncrypted( (char*)&anz, 4 );
+        k->getNachrichtEncrypted( (char *)& anz, 4 );
         for( int i = 0; i < anz; i++ )
         {
             SpielerDaten *player = new SpielerDaten();
-            k->getNachrichtEncrypted( (char*)&player->id, 4 );
-            k->getNachrichtEncrypted( (char*)&player->pos.x, 4 );
-            k->getNachrichtEncrypted( (char*)&player->pos.y, 4 );
-            k->getNachrichtEncrypted( (char*)&player->rot, 8 );
-            k->getNachrichtEncrypted( (char*)&player->beschleunigung, 8 );
-            k->getNachrichtEncrypted( (char*)&player->maxStabilität, 4 );
-            k->getNachrichtEncrypted( (char*)&player->maxEnergie, 4 );
-            k->getNachrichtEncrypted( (char*)&player->reparatur, 8 );
-            k->getNachrichtEncrypted( (char*)&player->akkuLeistung, 8 );
-            k->getNachrichtEncrypted( (char*)&player->laserIntensität, 4 );
-            k->getNachrichtEncrypted( (char*)&player->laserEffizienz, 4 );
-            k->getNachrichtEncrypted( (char*)&player->laserTempo, 4 );
-            k->getNachrichtEncrypted( (char*)&player->wendigkeit, 8 );
-            k->getNachrichtEncrypted( (char*)&player->antriebEffizienz, 8 );
-            k->getNachrichtEncrypted( (char*)&player->energieSchild, 8 );
-            k->getNachrichtEncrypted( (char*)&player->energieSchildEffizienz, 8 );
-            k->getNachrichtEncrypted( (char*)&player->netzwerk, 4 );
-            k->getNachrichtEncrypted( (char*)&player->skillPunkte, 4 );
-            k->getNachrichtEncrypted( (char*)&player->m2d, 4 );
-            k->getNachrichtEncrypted( (char*)&player->bild, 4 );
+            k->getNachrichtEncrypted( (char *)& player->id, 4 );
+            k->getNachrichtEncrypted( (char *)& player->pos.x, 4 );
+            k->getNachrichtEncrypted( (char *)& player->pos.y, 4 );
+            k->getNachrichtEncrypted( (char *)& player->rot, 8 );
+            k->getNachrichtEncrypted( (char *)& player->beschleunigung, 8 );
+            k->getNachrichtEncrypted( (char *)& player->maxStabilität, 4 );
+            k->getNachrichtEncrypted( (char *)& player->maxEnergie, 4 );
+            k->getNachrichtEncrypted( (char *)& player->reparatur, 8 );
+            k->getNachrichtEncrypted( (char *)& player->akkuLeistung, 8 );
+            k->getNachrichtEncrypted( (char *)& player->laserIntensität, 4 );
+            k->getNachrichtEncrypted( (char *)& player->laserEffizienz, 4 );
+            k->getNachrichtEncrypted( (char *)& player->laserTempo, 4 );
+            k->getNachrichtEncrypted( (char *)& player->wendigkeit, 8 );
+            k->getNachrichtEncrypted( (char *)& player->antriebEffizienz, 8 );
+            k->getNachrichtEncrypted( (char *)& player->energieSchild, 8 );
+            k->getNachrichtEncrypted( (char *)& player->energieSchildEffizienz, 8 );
+            k->getNachrichtEncrypted( (char *)& player->netzwerk, 4 );
+            k->getNachrichtEncrypted( (char *)& player->skillPunkte, 4 );
+            k->getNachrichtEncrypted( (char *)& player->m2d, 4 );
+            k->getNachrichtEncrypted( (char *)& player->bild, 4 );
             spieler.add( player );
         }
     }
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -372,7 +419,7 @@ bool EditorKlient::loadSpieler( Array< SpielerDaten* > &spieler )
     return ret == 1;
 }
 
-bool EditorKlient::loadTeams( Array< TeamDaten* > &teams )
+bool EditorKlient::loadTeams( Array< TeamDaten * > &teams )
 {
     Network::Klient *k = klient->beginEditorMessage();
     if( !k )
@@ -387,32 +434,32 @@ bool EditorKlient::loadTeams( Array< TeamDaten* > &teams )
     if( ret == 1 )
     {
         int anz = 0;
-        k->getNachrichtEncrypted( (char*)&anz, 4 );
+        k->getNachrichtEncrypted( (char *)& anz, 4 );
         for( int i = 0; i < anz; i++ )
         {
             TeamDaten *team = new TeamDaten();
-            k->getNachrichtEncrypted( (char*)&team->id, 4 );
-            k->getNachrichtEncrypted( (char*)&team->maxPunkte, 4 );
-            k->getNachrichtEncrypted( (char*)&team->beschleunigung, 8 );
-            k->getNachrichtEncrypted( (char*)&team->maxStabilität, 4 );
-            k->getNachrichtEncrypted( (char*)&team->maxEnergie, 4 );
-            k->getNachrichtEncrypted( (char*)&team->reparatur, 8 );
-            k->getNachrichtEncrypted( (char*)&team->akkuLeistung, 8 );
-            k->getNachrichtEncrypted( (char*)&team->laserIntensität, 4 );
-            k->getNachrichtEncrypted( (char*)&team->laserEffizienz, 4 );
-            k->getNachrichtEncrypted( (char*)&team->laserTempo, 4 );
-            k->getNachrichtEncrypted( (char*)&team->wendigkeit, 8 );
-            k->getNachrichtEncrypted( (char*)&team->antriebEffizienz, 8 );
-            k->getNachrichtEncrypted( (char*)&team->energieSchild, 8 );
-            k->getNachrichtEncrypted( (char*)&team->energieSchildEffizienz, 8 );
-            k->getNachrichtEncrypted( (char*)&team->punkte, 4 );
+            k->getNachrichtEncrypted( (char *)& team->id, 4 );
+            k->getNachrichtEncrypted( (char *)& team->maxPunkte, 4 );
+            k->getNachrichtEncrypted( (char *)& team->beschleunigung, 8 );
+            k->getNachrichtEncrypted( (char *)& team->maxStabilität, 4 );
+            k->getNachrichtEncrypted( (char *)& team->maxEnergie, 4 );
+            k->getNachrichtEncrypted( (char *)& team->reparatur, 8 );
+            k->getNachrichtEncrypted( (char *)& team->akkuLeistung, 8 );
+            k->getNachrichtEncrypted( (char *)& team->laserIntensität, 4 );
+            k->getNachrichtEncrypted( (char *)& team->laserEffizienz, 4 );
+            k->getNachrichtEncrypted( (char *)& team->laserTempo, 4 );
+            k->getNachrichtEncrypted( (char *)& team->wendigkeit, 8 );
+            k->getNachrichtEncrypted( (char *)& team->antriebEffizienz, 8 );
+            k->getNachrichtEncrypted( (char *)& team->energieSchild, 8 );
+            k->getNachrichtEncrypted( (char *)& team->energieSchildEffizienz, 8 );
+            k->getNachrichtEncrypted( (char *)& team->punkte, 4 );
             teams.add( team );
         }
     }
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -424,7 +471,7 @@ bool EditorKlient::loadTeams( Array< TeamDaten* > &teams )
     return ret == 1;
 }
 
-bool EditorKlient::loadObjekte( Array< ObjektDaten* > &objekte )
+bool EditorKlient::loadObjekte( Array< ObjektDaten * > &objekte )
 {
     Network::Klient *k = klient->beginEditorMessage();
     if( !k )
@@ -439,29 +486,29 @@ bool EditorKlient::loadObjekte( Array< ObjektDaten* > &objekte )
     if( ret == 1 )
     {
         int anz = 0;
-        k->getNachrichtEncrypted( (char*)&anz, 4 );
+        k->getNachrichtEncrypted( (char *)& anz, 4 );
         for( int i = 0; i < anz; i++ )
         {
             ObjektDaten *objekt = new ObjektDaten();
-            k->getNachrichtEncrypted( (char*)&objekt->pos.x, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->pos.y, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->id, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->m2d, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->bild, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->style, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->maxStabilität, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->maxEnergie, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->energieRadius, 4 );
-            k->getNachrichtEncrypted( (char*)&objekt->reparatur, 8 );
-            k->getNachrichtEncrypted( (char*)&objekt->akkuLeistung, 8 );
-            k->getNachrichtEncrypted( (char*)&objekt->team, 1 );
+            k->getNachrichtEncrypted( (char *)& objekt->pos.x, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->pos.y, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->id, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->m2d, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->bild, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->style, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->maxStabilität, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->maxEnergie, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->energieRadius, 4 );
+            k->getNachrichtEncrypted( (char *)& objekt->reparatur, 8 );
+            k->getNachrichtEncrypted( (char *)& objekt->akkuLeistung, 8 );
+            k->getNachrichtEncrypted( (char *)& objekt->team, 1 );
             objekte.add( objekt );
         }
     }
     if( ret == 3 )
     {
         unsigned char l = 0;
-        k->getNachrichtEncrypted( (char*)&l, 1 );
+        k->getNachrichtEncrypted( (char *)& l, 1 );
         char *err = new char[ l + 1 ];
         err[ l ] = 0;
         k->getNachrichtEncrypted( err, l );
@@ -473,12 +520,134 @@ bool EditorKlient::loadObjekte( Array< ObjektDaten* > &objekte )
     return ret == 1;
 }
 
+Bild *EditorKlient::loadBild( const char *templatePath )
+{
+    Text txt( templatePath );
+    Text pfad;
+    if( txt.positionVon( "spiel:" ) == 0 )
+    {
+        pfad = "data/spiele/Asteroids";
+        pfad.append( txt.getTeilText( 6 ) );
+        if( pfad.hat( ".ltdb/" ) )
+        {
+            int pos = pfad.positionVon( ".ltdb/", pfad.anzahlVon( ".ltdb/" ) - 1 );
+            LTDBDatei datei;
+            datei.setDatei( pfad.getTeilText( 0, pos + 5 ) );
+            datei.leseDaten( 0 );
+            return datei.laden( 0, pfad.getTeilText( pos + 6 ) );
+        }
+    }
+    if( txt.positionVon( "map:" ) == 0 )
+    {
+        pfad.append( txt.getTeilText( 5 ) );
+        if( pfad.hat( ".ltdb/" ) )
+        {
+            if( klient->deResetPath() )
+            {
+                while( pfad.anzahlVon( "/" ) > 1 )
+                {
+                    Text *name = pfad.getTeilText( 0, pfad.positionVon( "/" ) );
+                    klient->deOrdnerÖffnen( name );
+                    pfad.remove( 0, name->getLength() + 1 );
+                    name->release();
+                }
+                Text *datei = pfad.getTeilText( 0, pfad.positionVon( ".ltdb/" ) + 5 );
+                Text * bild = pfad.getTeilText( pfad.positionVon( ".ltdb/" ) + 6 );
+                Bild * res = klient->deBildLaden( datei, bild, 0 );
+                datei->release();
+                bild->release();
+                return res;
+            }
+        }
+    }
+    error = klient->getLetzterFehler();
+    return 0;
+}
+
+Model2DData *EditorKlient::loadModel( const char *templatePath )
+{
+    Text txt( templatePath );
+    Text pfad;
+    if( txt.positionVon( "spiel:" ) == 0 )
+    {
+        pfad = "data/spiele/Asteroids";
+        pfad.append( txt.getTeilText( 6 ) );
+        if( pfad.hat( ".m2/" ) )
+        {
+            int pos = pfad.positionVon( ".m2/", pfad.anzahlVon( ".m2/" ) - 1 );
+            M2Datei datei;
+            Text * file = pfad.getTeilText( 0, pos + 3 );
+            datei.setPfad( file->getText() );
+            file->release();
+            datei.leseDaten();
+            return datei.ladeModel( pfad.getTeilText( pos + 4 ) );
+        }
+    }
+    if( txt.positionVon( "map:" ) == 0 )
+    {
+        pfad.append( txt.getTeilText( 5 ) );
+        if( pfad.hat( ".m2/" ) )
+        {
+            if( klient->deResetPath() )
+            {
+                while( pfad.anzahlVon( "/" ) > 1 )
+                {
+                    Text *name = pfad.getTeilText( 0, pfad.positionVon( "/" ) );
+                    klient->deOrdnerÖffnen( name );
+                    pfad.remove( 0, name->getLength() + 1 );
+                    name->release();
+                }
+                Text *datei = pfad.getTeilText( 0, pfad.positionVon( ".m2/" ) + 3 );
+                Text * model = pfad.getTeilText( pfad.positionVon( ".m2/" ) + 4 );
+                Model2DData * res = klient->deModelLaden( datei, model, 0 );
+                datei->release();
+                model->release();
+                return res;
+            }
+        }
+    }
+    error = klient->getLetzterFehler();
+    return 0;
+}
+
 // Lädt die Spieler Team Struktur
-bool EditorKlient::getSpielerTeamStruktur( SpielerTeamStrukturV *sts )
+bool EditorKlient::getSpielerTeamStruktur( SpielerTeamStrukturV * sts )
 {
     return klient->ladeTeamDaten( sts );
 }
 
+bool EditorKlient::loadMapSize( Punkt & size )
+{
+    Network::Klient *k = klient->beginEditorMessage();
+    if( !k )
+    {
+        error = klient->getLetzterFehler();
+        return 0;
+    }
+    error = "";
+    char ret;
+    k->sendeEncrypted( "\xB", 1 );
+    k->getNachrichtEncrypted( &ret, 1 );
+    if( ret == 1 )
+    {
+        k->getNachrichtEncrypted( (char *)& size.x, 4 );
+        k->getNachrichtEncrypted( (char *)& size.y, 4 );
+    }
+    if( ret == 3 )
+    {
+        unsigned char l = 0;
+        k->getNachrichtEncrypted( (char *)& l, 1 );
+        char *err = new char[ l + 1 ];
+        err[ l ] = 0;
+        k->getNachrichtEncrypted( err, l );
+        error = err;
+        delete[] err;
+        ret = 0;
+    }
+    klient->endEditorMessage();
+    return ret == 1;
+}
+
 // Gibt den Letzten Fehler zurück
 char *EditorKlient::getLastError() const
 {

+ 6 - 1
Asteroids/Editor/Netzwerk/EditorKlient.h

@@ -1,9 +1,11 @@
 #pragma once
 
 #include <KSGNetwork.h>
+#include <Punkt.h>
 
 namespace Editor
 {
+    struct ResourceDaten;
     struct TeamDaten;
     struct SpielerDaten;
     struct ObjektDaten;
@@ -41,14 +43,17 @@ namespace Editor
         bool sitzungBeenden();
         // Lädt die Spieler Team Struktur
         bool getSpielerTeamStruktur( SpielerTeamStrukturV *zSts );
-
+        bool loadMapSize( Punkt &size );
         bool saveTeam( const TeamDaten *team );
         bool saveSpieler( const SpielerDaten *spieler );
         bool saveObjekt( const ObjektDaten *objekt );
         bool deleteObjekt( int id );
+        bool loadResources( Array< ResourceDaten * > &resources );
         bool loadSpieler( Array< SpielerDaten* > &spieler );
         bool loadTeams( Array< TeamDaten* > &teams );
         bool loadObjekte( Array< ObjektDaten* > &Objekte );
+        Bild *loadBild( const char *templatePath );
+        Model2DData *loadModel( const char *templatePath );
         // Gibt den Letzten Fehler zurück
         char *getLastError() const;
         // Reference Counting

+ 2 - 2
Asteroids/Spiel/Karte/Karte.cpp

@@ -188,9 +188,9 @@ int Karte::getZeichnungAnzahl() const
 int Karte::getTeamNummer( int sNum ) const
 {
     int min = teamGröße->get( 0 );
-    for( int i = 1; i <= teamAnzahl; i++ )
+    for( int i = 1; i < teamAnzahl; i++ )
     {
-        if( sNum < min )
+        if( sNum <= min )
             return i - 1;
         min += teamGröße->hat( i ) ? teamGröße->get( i ) : 0;
     }