Jelajahi Sumber

Geschwindigkeitsanzeige hinzugefügt und kamerabewegung verbessert

Kolja Strohm 6 tahun lalu
induk
melakukan
300f8f776b

+ 17 - 1
Asteroids/Editor/Interface/RightTools/SpielerOptionen/SpielerOptionen.cpp

@@ -31,6 +31,7 @@ SpielerTool::SpielerTool( Schrift *zSchrift, KarteDaten *daten )
     skillStartEnergieSchildT = initTextFeld( 0, 305, 200, 20, zSchrift, TextFeld::Style::Text, "Energie Schild" );
     skillStartEnergieSchildEffizienzT = initTextFeld( 0, 330, 200, 20, zSchrift, TextFeld::Style::Text, "Schild Effizienz" );
     skillStartNetzwerkT = initTextFeld( 0, 355, 200, 20, zSchrift, TextFeld::Style::Text, "Netzwerk" );
+    skillStartPunkteT = initTextFeld( 0, 380, 200, 20, zSchrift, TextFeld::Style::Text, "Punkte" );
     const SpielerDaten *spieler = daten->getSpieler( daten->getSpielerIndexById( 1 ) );
     skillStartStabilität = initTextFeld( 200, 55, 90, 20, zSchrift, TextFeld::Style::TextFeld, Text( spieler->maxStabilität ) );
     skillStartEnergie = initTextFeld( 200, 80, 90, 20, zSchrift, TextFeld::Style::TextFeld, Text( spieler->maxEnergie ) );
@@ -45,7 +46,8 @@ SpielerTool::SpielerTool( Schrift *zSchrift, KarteDaten *daten )
     skillStartEnergieSchild = initTextFeld( 200, 305, 90, 20, zSchrift, TextFeld::Style::TextFeld, Text( spieler->energieSchild ) );
     skillStartEnergieSchildEffizienz = initTextFeld( 200, 330, 90, 20, zSchrift, TextFeld::Style::TextFeld, Text( spieler->energieSchildEffizienz ) );
     skillStartNetzwerk = initTextFeld( 200, 355, 90, 20, zSchrift, TextFeld::Style::TextFeld, Text( spieler->netzwerk ) );
-    speichern = initKnopf( 0, 380, 100, 20, zSchrift, Knopf::Style::Normal, "Speichern" );
+    skillStartPunkte = initTextFeld( 200, 380, 90, 20, zSchrift, TextFeld::Style::TextFeld, Text( spieler->skillPunkte ) );
+    speichern = initKnopf( 0, 405, 100, 20, zSchrift, Knopf::Style::Normal, "Speichern" );
     this->daten = daten;
 }
 
@@ -66,6 +68,7 @@ SpielerTool::~SpielerTool()
     skillStartEnergieSchildT->release();
     skillStartEnergieSchildEffizienzT->release();
     skillStartNetzwerkT->release();
+    skillStartPunkteT->release();
     skillStartStabilität->release();
     skillStartEnergie->release();
     skillStartReparatur->release();
@@ -79,6 +82,7 @@ SpielerTool::~SpielerTool()
     skillStartEnergieSchild->release();
     skillStartEnergieSchildEffizienz->release();
     skillStartNetzwerk->release();
+    skillStartPunkte->release();
     speichern->release();
     daten->release();
 }
@@ -105,6 +109,7 @@ void SpielerTool::doMausEreignis( MausEreignis &me )
     skillStartEnergieSchildT->doMausEreignis( me );
     skillStartEnergieSchildEffizienzT->doMausEreignis( me );
     skillStartNetzwerkT->doMausEreignis( me );
+    skillStartPunkteT->doMausEreignis( me );
     skillStartStabilität->doMausEreignis( me );
     skillStartEnergie->doMausEreignis( me );
     skillStartReparatur->doMausEreignis( me );
@@ -118,6 +123,7 @@ void SpielerTool::doMausEreignis( MausEreignis &me )
     skillStartEnergieSchild->doMausEreignis( me );
     skillStartEnergieSchildEffizienz->doMausEreignis( me );
     skillStartNetzwerk->doMausEreignis( me );
+    skillStartPunkte->doMausEreignis( me );
     bool verarbeitet = me.verarbeitet;
     speichern->doMausEreignis( me );
     if( !verarbeitet && me.verarbeitet && me.id == ME_RLinks )
@@ -136,6 +142,7 @@ void SpielerTool::doMausEreignis( MausEreignis &me )
         data.energieSchild = *skillStartEnergieSchild->zText();
         data.energieSchildEffizienz = *skillStartEnergieSchildEffizienz->zText();
         data.netzwerk = *skillStartNetzwerk->zText();
+        data.skillPunkte = *skillStartPunkte->zText();
         daten->getSpieler( daten->getSpielerIndexById( spielerAuswahl->getAuswahl() + 1 ), [ data ]( SpielerDaten *daten ) -> bool
         {
             *daten = data;
@@ -167,6 +174,7 @@ void SpielerTool::doTastaturEreignis( TastaturEreignis &te )
     skillStartEnergieSchildT->doTastaturEreignis( te );
     skillStartEnergieSchildEffizienzT->doTastaturEreignis( te );
     skillStartNetzwerkT->doTastaturEreignis( te );
+    skillStartPunkteT->doTastaturEreignis( te );
     skillStartStabilität->doTastaturEreignis( te );
     skillStartEnergie->doTastaturEreignis( te );
     skillStartReparatur->doTastaturEreignis( te );
@@ -180,6 +188,7 @@ void SpielerTool::doTastaturEreignis( TastaturEreignis &te )
     skillStartEnergieSchild->doTastaturEreignis( te );
     skillStartEnergieSchildEffizienz->doTastaturEreignis( te );
     skillStartNetzwerk->doTastaturEreignis( te );
+    skillStartPunkte->doTastaturEreignis( te );
     speichern->doTastaturEreignis( te );
 }
 
@@ -203,6 +212,7 @@ bool SpielerTool::tick( double tickVal )
     ret |= skillStartEnergieSchildT->tick( tickVal );
     ret |= skillStartEnergieSchildEffizienzT->tick( tickVal );
     ret |= skillStartNetzwerkT->tick( tickVal );
+    ret |= skillStartPunkteT->tick( tickVal );
     ret |= skillStartStabilität->tick( tickVal );
     ret |= skillStartEnergie->tick( tickVal );
     ret |= skillStartReparatur->tick( tickVal );
@@ -216,6 +226,7 @@ bool SpielerTool::tick( double tickVal )
     ret |= skillStartEnergieSchild->tick( tickVal );
     ret |= skillStartEnergieSchildEffizienz->tick( tickVal );
     ret |= skillStartNetzwerk->tick( tickVal );
+    ret |= skillStartPunkte->tick( tickVal );
     ret |= speichern->tick( tickVal );
     return ret;
 }
@@ -241,6 +252,7 @@ void SpielerTool::render( Bild &rObj )
         skillStartEnergieSchildT->render( rObj );
         skillStartEnergieSchildEffizienzT->render( rObj );
         skillStartNetzwerkT->render( rObj );
+        skillStartPunkteT->render( rObj );
         skillStartStabilität->render( rObj );
         skillStartEnergie->render( rObj );
         skillStartReparatur->render( rObj );
@@ -254,6 +266,7 @@ void SpielerTool::render( Bild &rObj )
         skillStartEnergieSchild->render( rObj );
         skillStartEnergieSchildEffizienz->render( rObj );
         skillStartNetzwerk->render( rObj );
+        skillStartPunkte->render( rObj );
         speichern->render( rObj );
         rObj.releaseDrawOptions();
     }
@@ -274,5 +287,8 @@ void SpielerTool::selectPlayer( int id )
     skillStartLaserIntensität->setText( Text( spieler->laserIntensität ) );
     skillStartLaserEffizienz->setText( Text( spieler->laserEffizienz ) );
     skillStartLaserTempo->setText( Text( spieler->laserTempo ) );
+    skillStartEnergieSchild->setText( Text( spieler->energieSchild ) );
+    skillStartEnergieSchildEffizienz->setText( Text( spieler->energieSchildEffizienz ) );
     skillStartNetzwerk->setText( Text( spieler->netzwerk ) );
+    skillStartPunkte->setText( Text( spieler->skillPunkte ) );
 }

+ 2 - 0
Asteroids/Editor/Interface/RightTools/SpielerOptionen/SpielerOptionen.h

@@ -24,6 +24,7 @@ namespace Editor
         TextFeld *skillStartEnergieSchildT;
         TextFeld *skillStartEnergieSchildEffizienzT;
         TextFeld *skillStartNetzwerkT;
+        TextFeld *skillStartPunkteT;
         TextFeld *skillStartStabilität;
         TextFeld *skillStartEnergie;
         TextFeld *skillStartReparatur;
@@ -37,6 +38,7 @@ namespace Editor
         TextFeld *skillStartEnergieSchild;
         TextFeld *skillStartEnergieSchildEffizienz;
         TextFeld *skillStartNetzwerk;
+        TextFeld *skillStartPunkte;
         Knopf *speichern;
         KarteDaten *daten;
 

+ 171 - 3
Asteroids/Spiel/SpielKlasse.cpp

@@ -54,6 +54,7 @@ SpielKlasse::SpielKlasse()
 	schüsse = new RCArray< Laser >();
 	shipGUI = 0;
 	spielPause = 1;
+    setKam = 0;
 	ref = 1;
     save();
 }
@@ -448,6 +449,10 @@ void SpielKlasse::stknVerarbeitung()
 		län--;
 		int sNum = 0;
         int presence = spielZeit;
+        Vertex pos;
+        Vertex speed;
+        float rot;
+        float rotS;
         if( presence > zeit + 10 )
             presence = zeit + 10; // maximale zeitdifferenz von client und server
 		switch( bytes[ 0 ] )
@@ -455,12 +460,38 @@ void SpielKlasse::stknVerarbeitung()
 		case 0: // spieler drückt gas
 			bytes++;
 			sNum = *(int*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
 			län -= 4;
             goBackInTime( zeit );
 			for( auto i = spieler->getIterator(); i; i++ )
 			{
 				if( i->getSpielerNummer() == sNum )
                 {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_GAS, 1 );
                 }
 			}
@@ -469,12 +500,38 @@ void SpielKlasse::stknVerarbeitung()
 		case 1: // spieler lässt gas los
 			bytes++;
 			sNum = *(int*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
             län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                 {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_GAS, 0 );
                 }
             }
@@ -483,12 +540,38 @@ void SpielKlasse::stknVerarbeitung()
 		case 2: // spieler drückt rotl
 			bytes++;
 			sNum = *(int*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
             län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                 {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_ROT_L, 1 );
                 }
             }
@@ -497,12 +580,38 @@ void SpielKlasse::stknVerarbeitung()
 		case 3: // spieler lässt rotl los
 			bytes++;
 			sNum = *(int*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
             län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                 {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_ROT_L, 0 );
                 }
             }
@@ -511,12 +620,38 @@ void SpielKlasse::stknVerarbeitung()
 		case 4: // spieler drückt rotr
 			bytes++;
 			sNum = *(int*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
             län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                 {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_ROT_R, 1 );
                 }
             }
@@ -525,12 +660,38 @@ void SpielKlasse::stknVerarbeitung()
 		case 5: // spieler lässt rotr los
 			bytes++;
 			sNum = *(int*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
             län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                 {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_ROT_R, 0 );
                 }
             }
@@ -920,6 +1081,7 @@ bool SpielKlasse::tick( double zeit )
         minimap->tick( TICK );
         // Kamera bewegen
         Vertex tPos;
+        Vertex speed;
         bool setKam = 0;
 		for( int i = 0; i < spielerAnzahl; i++ )
 		{
@@ -928,14 +1090,15 @@ bool SpielKlasse::tick( double zeit )
 			if( spielerNummer == spieler->z( i )->getSpielerNummer() )
 			{
                 tPos = spieler->z( i )->getPosition();
+                speed = spieler->z( i )->getSpeed();
 				setKam = spieler->z( i )->istAmLeben();
 			}
 		}
 		unlock();
 		if( setKam )
 		{
-            if( isnan( kam->getWorldPosition().x ) || isnan( kam->getWorldPosition().y ) )
-                kam->setPosition( tPos );
+            if( !this->setKam || isnan( kam->getWorldPosition().x ) || isnan( kam->getWorldPosition().y ) )
+                kam->lookAtWorldPos( tPos );
             Vertex str = ( tPos - kam->getWorldPosition() );
             if( ( tPos + welt->getWorldInfo().size - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
                 str = ( tPos + welt->getWorldInfo().size - kam->getWorldPosition() );
@@ -953,8 +1116,13 @@ bool SpielKlasse::tick( double zeit )
                 str = ( tPos + Punkt( welt->getWorldInfo().size.x, -welt->getWorldInfo().size.y ) - kam->getWorldPosition() );
             if( ( tPos + Punkt( -welt->getWorldInfo().size.x, welt->getWorldInfo().size.y ) - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
                 str = ( tPos + Punkt( -welt->getWorldInfo().size.x, welt->getWorldInfo().size.y ) - kam->getWorldPosition() );
-			kam->lookAtWorldPos( kam->getWorldPosition() + str / 4.f * (float)TICK );
+            float faktor = str.getLength() / 200.f;
+            if( faktor > 1.f )
+                faktor = 1.f;
+			kam->lookAtWorldPos( kam->getWorldPosition() + speed * faktor * (float)TICK );
+            kam->lookAtWorldPos( kam->getWorldPosition() + str * faktor * 0.1f * (float)TICK );
 		}
+        this->setKam = setKam;
 		chat->tick( !zeit ? 0.05 : zeit );
 		if( shipGUI )
 		    shipGUI->tick( !zeit ? 0.05 : zeit );

+ 1 - 0
Asteroids/Spiel/SpielKlasse.h

@@ -53,6 +53,7 @@ private:
 	char *tasten;
 	bool spielPause;
     SaveData last;
+    bool setKam;
 	int ref;
 
 	bool istAmLeben() const;

+ 13 - 10
Asteroids/Spiel/Spieler/Spieler.cpp

@@ -78,7 +78,9 @@ Spieler::~Spieler()
 
 double Spieler::calculateLaserCost()
 {
-    double kosten = ( ( laserIntensität + team->laserIntensität ) / 2 + ( laserTempo + team->laserTempo ) / 13 ) * ( 1 / ( ( laserEffizienz + team->laserEffizienz ) / 25 ) );
+    double kosten = ( ( laserIntensität + team->laserIntensität ) / 2 +
+        ( laserTempo + team->laserTempo ) / 9 ) *
+                      ( 1 / ( ( laserEffizienz + team->laserEffizienz ) / 25 ) );
     if( kosten < 1 )
         kosten = 1;
     return kosten;
@@ -372,11 +374,11 @@ void Spieler::setSkill( int art )
         team->laserEffizienz = team->getLaserEffizienzBonus();
         break;
     case 5: // Laser Tempo
-        laserTempo += 20;
+        laserTempo += 15;
         team->laserTempo = team->getLaserTempoBonus();
         break;
     case 6: // Beschleunigung
-        beschleunigung += 1.75;
+        beschleunigung += 10;
         team->beschleunigung = team->getBeschleunigungBonus();
         break;
     case 7: // Wendigkeit
@@ -406,12 +408,12 @@ void Spieler::setSkill( int art )
         antriebEffizienz += 10;
         team->antriebEffizienz = team->getAntriebEffizienzBonus();
         break;
-    case 11: // Antrieb Effizienz
-        energieSchild += 1;
+    case 11: // Energie Schild
+        energieSchild += 0.075;
         team->energieSchild = team->getEnergieSchildBonus();
         break;
-    case 12: // Antrieb Effizienz
-        energieSchildEffizienz += 2;
+    case 12: // Energie Schild Effizienz
+        energieSchildEffizienz += 10;
         team->energieSchildEffizienz = team->getEnergieSchildEffizienzBonus();
         break;
     }
@@ -419,17 +421,18 @@ void Spieler::setSkill( int art )
 
 void Spieler::nimmSchaden( double &intensität )
 {
-    double schieldVal = intensität / 100 * energieSchild;
-    double schieldEVal = schieldVal - schieldVal / 100 * energieSchildEffizienz;
+    double schieldVal = intensität - intensität / ( energieSchild + team->energieSchild );
+    double schieldEVal = schieldVal / ( ( energieSchildEffizienz + team->energieSchildEffizienz ) / 100 );
     if( schieldEVal > energie )
     {
         schieldEVal = energie;
-        schieldVal = schieldEVal / ( 1 - ( energieSchildEffizienz / 100 ) );
+        schieldVal = schieldEVal * ( ( energieSchildEffizienz + team->energieSchildEffizienz ) / 100 );
     }
     intensität -= schieldVal;
     energie -= schieldEVal;
     stabilität -= intensität;
     schadenBekommen += intensität;
+    energieAbk = 1.5;
     repAbk = 2;
 }
 

+ 277 - 263
Asteroids/Spiel/SpielerGUI/SpielerGUI.cpp

@@ -8,190 +8,194 @@ using namespace Framework;
 
 int getStellen( double d )
 {
-	int ret = 0;
-	for( int i = 1; d >= i; i *= 10 )
-		ret++;
-	return ret;
+    int ret = 0;
+    for( int i = 1; d >= i; i *= 10 )
+        ret++;
+    return ret;
 }
 
 // Inhalt der Ship Klasse aus Ship.h
 // Konstruktor
 SpielerGUI::SpielerGUI( Schrift *zSchrift )
 {
-	ram = new LRahmen();
-	ram->setSize( 200, 382 );
-	ram->setPosition( Punkt( BildschirmGröße().x - 210, 10 ) );
-	ram->setFarbe( 0xFFFFFFFF );
-	spieler = initTextFeld( 5, 5, 190, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
-	stabilität = initTextFeld( 5, 30, 165, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
-	energie = initTextFeld( 5, 55, 165, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
-	stabilitätB = new FBalken();
-	stabilitätB->setPosition( 5, 30 );
-	stabilitätB->setSize( 165, 20 );
-	stabilitätB->setHintergrundFarbe( 0xFF000000 );
-	stabilitätB->setFBgFarbe( 0xFF55FF55 );
-	stabilitätB->setLinienRahmenFarbe( 0xFF00FF00 );
-	stabilitätB->setLinienRahmenBreite( 1 );
-	stabilitätB->setFRFarbe( 0xFF00FF00 );
-	stabilitätB->setFRBreite( 1 );
-	stabilitätB->setStyle( FBalken::Style::Sichtbar | FBalken::Style::L_R | FBalken::Style::Hintergrund | FBalken::Style::FFarbe | FBalken::Style::Rahmen | FBalken::Style::FRahmen );
-	energieB = new FBalken();
-	energieB->setPosition( 5, 55 );
-	energieB->setSize( 165, 20 );
-	energieB->setHintergrundFarbe( 0xFF000000 );
-	energieB->setFBgFarbe( 0xFF5555FF );
-	energieB->setLinienRahmenFarbe( 0xFF0000FF );
-	energieB->setLinienRahmenBreite( 1 );
-	energieB->setFRFarbe( 0xFF0000FF );
-	energieB->setFRBreite( 1 );
-	energieB->setStyle( FBalken::Style::Sichtbar | FBalken::Style::L_R | FBalken::Style::Hintergrund | FBalken::Style::FFarbe | FBalken::Style::Rahmen | FBalken::Style::FRahmen );
-	reparatur = initTextFeld( 5, 80, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
-	akkuLeistung = initTextFeld( 5, 105, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
-	wendigkeit = initTextFeld( 5, 130, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
-	beschleunigung = initTextFeld( 5, 155, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
+    player = 0;
+    ram = new LRahmen();
+    ram->setSize( 200, 407 );
+    ram->setPosition( Punkt( BildschirmGröße().x - 210, 10 ) );
+    ram->setFarbe( 0xFFFFFFFF );
+    spieler = initTextFeld( 5, 5, 190, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+    stabilität = initTextFeld( 5, 30, 165, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+    energie = initTextFeld( 5, 55, 165, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+    stabilitätB = new FBalken();
+    stabilitätB->setPosition( 5, 30 );
+    stabilitätB->setSize( 165, 20 );
+    stabilitätB->setHintergrundFarbe( 0xFF000000 );
+    stabilitätB->setFBgFarbe( 0xFF55FF55 );
+    stabilitätB->setLinienRahmenFarbe( 0xFF00FF00 );
+    stabilitätB->setLinienRahmenBreite( 1 );
+    stabilitätB->setFRFarbe( 0xFF00FF00 );
+    stabilitätB->setFRBreite( 1 );
+    stabilitätB->setStyle( FBalken::Style::Sichtbar | FBalken::Style::L_R | FBalken::Style::Hintergrund | FBalken::Style::FFarbe | FBalken::Style::Rahmen | FBalken::Style::FRahmen );
+    energieB = new FBalken();
+    energieB->setPosition( 5, 55 );
+    energieB->setSize( 165, 20 );
+    energieB->setHintergrundFarbe( 0xFF000000 );
+    energieB->setFBgFarbe( 0xFF5555FF );
+    energieB->setLinienRahmenFarbe( 0xFF0000FF );
+    energieB->setLinienRahmenBreite( 1 );
+    energieB->setFRFarbe( 0xFF0000FF );
+    energieB->setFRBreite( 1 );
+    energieB->setStyle( FBalken::Style::Sichtbar | FBalken::Style::L_R | FBalken::Style::Hintergrund | FBalken::Style::FFarbe | FBalken::Style::Rahmen | FBalken::Style::FRahmen );
+    reparatur = initTextFeld( 5, 80, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
+    akkuLeistung = initTextFeld( 5, 105, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
+    wendigkeit = initTextFeld( 5, 130, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
+    beschleunigung = initTextFeld( 5, 155, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
     antriebEffizienz = initTextFeld( 5, 180, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
     laserIntensität = initTextFeld( 5, 205, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
-	laserEffizienz = initTextFeld( 5, 230, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
-	laserTempo = initTextFeld( 5, 255, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
+    laserEffizienz = initTextFeld( 5, 230, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
+    laserTempo = initTextFeld( 5, 255, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
     energieSchild = initTextFeld( 5, 280, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
     energieSchildEffizienz = initTextFeld( 5, 305, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
-	netzwerk = initTextFeld( 5, 330, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
-	stabilitätSkill = initKnopf( 172, 30, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	energieSkill = initKnopf( 172, 55, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	reparaturSkill = initKnopf( 172, 80, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	akkuLeistungSkill = initKnopf( 172, 105, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	wendigkeitSkill = initKnopf( 172, 130, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	beschleunigungSkill = initKnopf( 172, 155, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    netzwerk = initTextFeld( 5, 330, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrfarbig | TextFeld::Style::VCenter, "" );
+    stabilitätSkill = initKnopf( 172, 30, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    energieSkill = initKnopf( 172, 55, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    reparaturSkill = initKnopf( 172, 80, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    akkuLeistungSkill = initKnopf( 172, 105, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    wendigkeitSkill = initKnopf( 172, 130, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    beschleunigungSkill = initKnopf( 172, 155, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
     antriebEffizienzSkill = initKnopf( 172, 180, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
     laserIntensitätSkill = initKnopf( 172, 205, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	laserEffizienzSkill = initKnopf( 172, 230, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	laserTempoSkill = initKnopf( 172, 255, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    laserEffizienzSkill = initKnopf( 172, 230, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    laserTempoSkill = initKnopf( 172, 255, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
     energieSchildSkill = initKnopf( 172, 280, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
     energieSchildEffizienzSkill = initKnopf( 172, 305, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	netzwerkSkill = initKnopf( 172, 330, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
-	stabilitätSkill->removeStyle( Knopf::Style::Erlaubt );
-	energieSkill->removeStyle( Knopf::Style::Erlaubt );
-	reparaturSkill->removeStyle( Knopf::Style::Erlaubt );
-	akkuLeistungSkill->removeStyle( Knopf::Style::Erlaubt );
-	wendigkeitSkill->removeStyle( Knopf::Style::Erlaubt );
-	beschleunigungSkill->removeStyle( Knopf::Style::Erlaubt );
-	laserIntensitätSkill->removeStyle( Knopf::Style::Erlaubt );
-	laserEffizienzSkill->removeStyle( Knopf::Style::Erlaubt );
-	laserTempoSkill->removeStyle( Knopf::Style::Erlaubt );
+    netzwerkSkill = initKnopf( 172, 330, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
+    stabilitätSkill->removeStyle( Knopf::Style::Erlaubt );
+    energieSkill->removeStyle( Knopf::Style::Erlaubt );
+    reparaturSkill->removeStyle( Knopf::Style::Erlaubt );
+    akkuLeistungSkill->removeStyle( Knopf::Style::Erlaubt );
+    wendigkeitSkill->removeStyle( Knopf::Style::Erlaubt );
+    beschleunigungSkill->removeStyle( Knopf::Style::Erlaubt );
+    laserIntensitätSkill->removeStyle( Knopf::Style::Erlaubt );
+    laserEffizienzSkill->removeStyle( Knopf::Style::Erlaubt );
+    laserTempoSkill->removeStyle( Knopf::Style::Erlaubt );
     energieSchildSkill->removeStyle( Knopf::Style::Erlaubt );
     energieSchildEffizienzSkill->removeStyle( Knopf::Style::Erlaubt );
-	netzwerkSkill->removeStyle( Knopf::Style::Erlaubt );
+    netzwerkSkill->removeStyle( Knopf::Style::Erlaubt );
     skillPoints = initTextFeld( 5, 355, 180, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
-	ref = 1;
+    speed = initTextFeld( 5, 380, 180, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
+    ref = 1;
 }
 
 // Destruktor
 SpielerGUI::~SpielerGUI()
 {
-	ram->release();
-	spieler->release();
-	stabilität->release();
-	energie->release();
-	stabilitätB->release();
-	energieB->release();
-	reparatur->release();
-	akkuLeistung->release();
-	wendigkeit->release();
-	beschleunigung->release();
+    player->release();
+    ram->release();
+    spieler->release();
+    stabilität->release();
+    energie->release();
+    stabilitätB->release();
+    energieB->release();
+    reparatur->release();
+    akkuLeistung->release();
+    wendigkeit->release();
+    beschleunigung->release();
     antriebEffizienz->release();
-	laserIntensität->release();
-	laserEffizienz->release();
-	laserTempo->release();
+    laserIntensität->release();
+    laserEffizienz->release();
+    laserTempo->release();
     energieSchild->release();
     energieSchildEffizienz->release();
-	netzwerk->release();
-	stabilitätSkill->release();
-	energieSkill->release();
-	reparaturSkill->release();
-	akkuLeistungSkill->release();
-	wendigkeitSkill->release();
-	beschleunigungSkill->release();
+    netzwerk->release();
+    stabilitätSkill->release();
+    energieSkill->release();
+    reparaturSkill->release();
+    akkuLeistungSkill->release();
+    wendigkeitSkill->release();
+    beschleunigungSkill->release();
     antriebEffizienzSkill->release();
-	laserIntensitätSkill->release();
-	laserEffizienzSkill->release();
-	laserTempoSkill->release();
+    laserIntensitätSkill->release();
+    laserEffizienzSkill->release();
+    laserTempoSkill->release();
     energieSchildSkill->release();
     energieSchildEffizienzSkill->release();
-	netzwerkSkill->release();
+    netzwerkSkill->release();
     skillPoints->release();
 }
 
 // nicht constant
 void SpielerGUI::update( Spieler *zSpieler )
 {
-	spieler->setText( zSpieler->name->getText() );
-	spieler->setSchriftFarbe( zSpieler->farbe );
-	Text txt;
-	txt.setPrecision( getStellen( zSpieler->stabilität ) + 2 );
-	txt = zSpieler->stabilität;
-	txt += "/";
-	txt.setPrecision( getStellen( zSpieler->maxStabilität ) + 2 );
-	txt += zSpieler->maxStabilität;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->maxStabilität ) + 2 );
-	txt += zSpieler->team->maxStabilität;
-	txt += ")";
-	stabilität->setText( txt );
-	stabilitätB->reset();
-	stabilitätB->setAktionAnzahl( (int)( zSpieler->maxStabilität + zSpieler->team->maxStabilität ) );
-	stabilitätB->aktionPlus( (int)( zSpieler->stabilität ) );
-	txt.setPrecision( getStellen( zSpieler->energie ) + 2 );
-	txt = zSpieler->energie;
-	txt += "/";
-	txt.setPrecision( getStellen( zSpieler->maxEnergie ) + 2 );
-	txt += zSpieler->maxEnergie;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->maxEnergie ) + 2 );
-	txt += zSpieler->team->maxEnergie;
-	txt += ")";
-	energie->setText( txt );
-	energieB->reset();
-	energieB->setAktionAnzahl( (int)( zSpieler->maxEnergie + zSpieler->team->maxEnergie ) );
-	energieB->aktionPlus( (int)( zSpieler->energie ) );
-	txt = "Reparatur:";
-	txt.setPrecision( getStellen( zSpieler->reparatur ) + 2 );
-	txt += zSpieler->reparatur;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->reparatur ) + 2 );
-	txt += zSpieler->team->reparatur;
-	txt += ")";
-	reparatur->setText( txt );
-	txt = "Akku:";
-	txt.setPrecision( getStellen( zSpieler->akkuLeistung ) + 2 );
-	txt += zSpieler->akkuLeistung;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->akkuLeistung ) + 2 );
-	txt += zSpieler->team->akkuLeistung;
-	txt += ")";
-	akkuLeistung->setText( txt );
-	txt = "Wendigkeit:";
-	txt.setPrecision( getStellen( zSpieler->wendigkeit ) + 2 );
-	txt += zSpieler->wendigkeit;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->wendigkeit ) + 2 );
-	txt += zSpieler->team->wendigkeit;
-	txt += ")";
-	wendigkeit->setText( txt );
-	txt = "Beschleunigung:";
-	txt.setPrecision( getStellen( zSpieler->beschleunigung ) + 2 );
-	txt += zSpieler->beschleunigung;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->beschleunigung ) + 2 );
-	txt += zSpieler->team->beschleunigung;
-	txt += ")";
-	beschleunigung->setText( txt );
-	txt = "Antrieb effizienz:";
-	txt.setPrecision( getStellen( zSpieler->antriebEffizienz ) + 2 );
-	txt += zSpieler->antriebEffizienz;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->antriebEffizienz ) + 2 );
-	txt += zSpieler->team->antriebEffizienz;
-	txt += ")";
+    player = (Spieler*)zSpieler->getThis();
+    spieler->setText( zSpieler->name->getText() );
+    spieler->setSchriftFarbe( zSpieler->farbe );
+    Text txt;
+    txt.setPrecision( getStellen( zSpieler->stabilität ) + 2 );
+    txt = zSpieler->stabilität;
+    txt += "/";
+    txt.setPrecision( getStellen( zSpieler->maxStabilität ) + 2 );
+    txt += zSpieler->maxStabilität;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->maxStabilität ) + 2 );
+    txt += zSpieler->team->maxStabilität;
+    txt += ")";
+    stabilität->setText( txt );
+    stabilitätB->reset();
+    stabilitätB->setAktionAnzahl( (int)( zSpieler->maxStabilität + zSpieler->team->maxStabilität ) );
+    stabilitätB->aktionPlus( (int)( zSpieler->stabilität ) );
+    txt.setPrecision( getStellen( zSpieler->energie ) + 2 );
+    txt = zSpieler->energie;
+    txt += "/";
+    txt.setPrecision( getStellen( zSpieler->maxEnergie ) + 2 );
+    txt += zSpieler->maxEnergie;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->maxEnergie ) + 2 );
+    txt += zSpieler->team->maxEnergie;
+    txt += ")";
+    energie->setText( txt );
+    energieB->reset();
+    energieB->setAktionAnzahl( (int)( zSpieler->maxEnergie + zSpieler->team->maxEnergie ) );
+    energieB->aktionPlus( (int)( zSpieler->energie ) );
+    txt = "Reparatur:";
+    txt.setPrecision( getStellen( zSpieler->reparatur ) + 2 );
+    txt += zSpieler->reparatur;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->reparatur ) + 2 );
+    txt += zSpieler->team->reparatur;
+    txt += ")";
+    reparatur->setText( txt );
+    txt = "Akku:";
+    txt.setPrecision( getStellen( zSpieler->akkuLeistung ) + 2 );
+    txt += zSpieler->akkuLeistung;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->akkuLeistung ) + 2 );
+    txt += zSpieler->team->akkuLeistung;
+    txt += ")";
+    akkuLeistung->setText( txt );
+    txt = "Wendigkeit:";
+    txt.setPrecision( getStellen( zSpieler->wendigkeit ) + 2 );
+    txt += zSpieler->wendigkeit;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->wendigkeit ) + 2 );
+    txt += zSpieler->team->wendigkeit;
+    txt += ")";
+    wendigkeit->setText( txt );
+    txt = "Beschleunigung:";
+    txt.setPrecision( getStellen( zSpieler->beschleunigung ) + 2 );
+    txt += zSpieler->beschleunigung;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->beschleunigung ) + 2 );
+    txt += zSpieler->team->beschleunigung;
+    txt += ")";
+    beschleunigung->setText( txt );
+    txt = "Antrieb effizienz:";
+    txt.setPrecision( getStellen( zSpieler->antriebEffizienz ) + 2 );
+    txt += zSpieler->antriebEffizienz;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->antriebEffizienz ) + 2 );
+    txt += zSpieler->team->antriebEffizienz;
+    txt += ")";
     antriebEffizienz->setText( txt );
     txt = "Laser intensität:";
     txt.setPrecision( getStellen( zSpieler->laserIntensität ) + 2 );
@@ -200,23 +204,23 @@ void SpielerGUI::update( Spieler *zSpieler )
     txt.setPrecision( getStellen( zSpieler->team->laserIntensität ) + 2 );
     txt += zSpieler->team->laserIntensität;
     txt += ")";
-	laserIntensität->setText( txt );
-	txt = "Laser effizienz:";
-	txt.setPrecision( getStellen( zSpieler->laserEffizienz ) + 2 );
-	txt += zSpieler->laserEffizienz;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->laserEffizienz ) + 2 );
-	txt += zSpieler->team->laserEffizienz;
-	txt += ")";
-	laserEffizienz->setText( txt );
-	txt = "Laser tempo:";
-	txt.setPrecision( getStellen( zSpieler->laserTempo ) + 2 );
-	txt += zSpieler->laserTempo;
-	txt += "\r0xFF00FF00(+";
-	txt.setPrecision( getStellen( zSpieler->team->laserTempo ) + 2 );
-	txt += zSpieler->team->laserTempo;
-	txt += ")";
-	laserTempo->setText( txt );
+    laserIntensität->setText( txt );
+    txt = "Laser effizienz:";
+    txt.setPrecision( getStellen( zSpieler->laserEffizienz ) + 2 );
+    txt += zSpieler->laserEffizienz;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->laserEffizienz ) + 2 );
+    txt += zSpieler->team->laserEffizienz;
+    txt += ")";
+    laserEffizienz->setText( txt );
+    txt = "Laser tempo:";
+    txt.setPrecision( getStellen( zSpieler->laserTempo ) + 2 );
+    txt += zSpieler->laserTempo;
+    txt += "\r0xFF00FF00(+";
+    txt.setPrecision( getStellen( zSpieler->team->laserTempo ) + 2 );
+    txt += zSpieler->team->laserTempo;
+    txt += ")";
+    laserTempo->setText( txt );
     txt = "Energie Schild:";
     txt.setPrecision( getStellen( zSpieler->energieSchild ) + 2 );
     txt += zSpieler->energieSchild;
@@ -233,151 +237,161 @@ void SpielerGUI::update( Spieler *zSpieler )
     txt += zSpieler->team->energieSchildEffizienz;
     txt += ")";
     energieSchildEffizienz->setText( txt );
-	txt = "Netzwerk:";
-	txt.setPrecision( getStellen( zSpieler->netzwerk ) + 2 );
-	txt += zSpieler->netzwerk;
-	netzwerk->setText( txt );
-	stabilitätSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
-	energieSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
-	reparaturSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
-	akkuLeistungSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
-	wendigkeitSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
-	beschleunigungSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    txt = "Netzwerk:";
+    txt.setPrecision( getStellen( zSpieler->netzwerk ) + 2 );
+    txt += zSpieler->netzwerk;
+    netzwerk->setText( txt );
+    stabilitätSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    energieSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    reparaturSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    akkuLeistungSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    wendigkeitSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    beschleunigungSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
     antriebEffizienzSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
     laserIntensitätSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
-	laserEffizienzSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
-	laserTempoSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    laserEffizienzSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    laserTempoSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
     energieSchildSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
     energieSchildEffizienzSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
-	netzwerkSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
+    netzwerkSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
     skillPoints->setText( Text( zSpieler->skillPunkte ) += " Punkte" );
 }
 
 int SpielerGUI::doMausEreignis( MausEreignis &me )
 {
-	me.mx -= ram->getX();
-	me.my -= ram->getY();
+    me.mx -= ram->getX();
+    me.my -= ram->getY();
     if( me.mx < 0 || me.my < 0 )
     {
         me.mx += ram->getX();
         me.my += ram->getY();
         return -1;
     }
-	int aktion = me.verarbeitet;
-	stabilitätSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 2;
-	energieSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 3;
-	reparaturSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 4;
+    int aktion = me.verarbeitet;
+    stabilitätSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 2;
+    energieSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 3;
+    reparaturSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 4;
     antriebEffizienzSkill->doMausEreignis( me );
     if( !aktion && me.verarbeitet && me.id == ME_RLinks )
         aktion = 12;
-	laserIntensitätSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 5;
-	laserEffizienzSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 6;
-	laserTempoSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 7;
-	beschleunigungSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 8;
-	wendigkeitSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 9;
-	netzwerkSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 10;
-	akkuLeistungSkill->doMausEreignis( me );
-	if( !aktion && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 11;
+    laserIntensitätSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 5;
+    laserEffizienzSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 6;
+    laserTempoSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 7;
+    beschleunigungSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 8;
+    wendigkeitSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 9;
+    netzwerkSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 10;
+    akkuLeistungSkill->doMausEreignis( me );
+    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 11;
     energieSchildSkill->doMausEreignis( me );
     if( !aktion && me.verarbeitet && me.id == ME_RLinks )
         aktion = 13;
     energieSchildEffizienzSkill->doMausEreignis( me );
     if( !aktion && me.verarbeitet && me.id == ME_RLinks )
         aktion = 14;
-	me.mx += ram->getX();
-	me.my += ram->getY();
-	if( aktion > 1 )
-		return aktion - 2;
-	return -1;
+    me.mx += ram->getX();
+    me.my += ram->getY();
+    if( aktion > 1 )
+        return aktion - 2;
+    return -1;
 }
 
 bool SpielerGUI::tick( double tickVal )
 {
-	bool ret = stabilitätSkill->tick( tickVal );
-	ret |= energieSkill->tick( tickVal );
-	ret |= reparaturSkill->tick( tickVal );
-	ret |= akkuLeistungSkill->tick( tickVal );
-	ret |= wendigkeitSkill->tick( tickVal );
-	ret |= beschleunigungSkill->tick( tickVal );
+    bool ret = stabilitätSkill->tick( tickVal );
+    ret |= energieSkill->tick( tickVal );
+    ret |= reparaturSkill->tick( tickVal );
+    ret |= akkuLeistungSkill->tick( tickVal );
+    ret |= wendigkeitSkill->tick( tickVal );
+    ret |= beschleunigungSkill->tick( tickVal );
     ret |= antriebEffizienzSkill->tick( tickVal );
-	ret |= laserIntensitätSkill->tick( tickVal );
-	ret |= laserEffizienzSkill->tick( tickVal );
-	ret |= laserTempoSkill->tick( tickVal );
+    ret |= laserIntensitätSkill->tick( tickVal );
+    ret |= laserEffizienzSkill->tick( tickVal );
+    ret |= laserTempoSkill->tick( tickVal );
     ret |= energieSchildSkill->tick( tickVal );
     ret |= energieSchildEffizienzSkill->tick( tickVal );
-	ret |= netzwerkSkill->tick( tickVal );
-	return ret;
+    ret |= netzwerkSkill->tick( tickVal );
+    return ret;
 }
 
 void SpielerGUI::render( Bild &zRObj )
 {
-	zRObj.alphaRegion( ram->getX() + 1, ram->getY() + 1, ram->getBreite() - 2, ram->getHeight() - 2, 0xA0000000 );
-	ram->render( zRObj );
-	if( !zRObj.setDrawOptions( ram->getPosition() + Punkt( 1, 1 ), ram->getSize() - Punkt( 2, 2 ) ) )
-		return;
-	spieler->render( zRObj );
-	stabilitätB->render( zRObj );
-	stabilität->render( zRObj );
-	stabilitätSkill->render( zRObj );
-	energieB->render( zRObj );
-	energie->render( zRObj );
-	energieSkill->render( zRObj );
-	reparatur->render( zRObj );
-	reparaturSkill->render( zRObj );
-	akkuLeistung->render( zRObj );
-	akkuLeistungSkill->render( zRObj );
-	wendigkeit->render( zRObj );
-	wendigkeitSkill->render( zRObj );
-	beschleunigung->render( zRObj );
-	beschleunigungSkill->render( zRObj );
+    zRObj.alphaRegion( ram->getX() + 1, ram->getY() + 1, ram->getBreite() - 2, ram->getHeight() - 2, 0xA0000000 );
+    ram->render( zRObj );
+    if( !zRObj.setDrawOptions( ram->getPosition() + Punkt( 1, 1 ), ram->getSize() - Punkt( 2, 2 ) ) )
+        return;
+    spieler->render( zRObj );
+    stabilitätB->render( zRObj );
+    stabilität->render( zRObj );
+    stabilitätSkill->render( zRObj );
+    energieB->render( zRObj );
+    energie->render( zRObj );
+    energieSkill->render( zRObj );
+    reparatur->render( zRObj );
+    reparaturSkill->render( zRObj );
+    akkuLeistung->render( zRObj );
+    akkuLeistungSkill->render( zRObj );
+    wendigkeit->render( zRObj );
+    wendigkeitSkill->render( zRObj );
+    beschleunigung->render( zRObj );
+    beschleunigungSkill->render( zRObj );
     antriebEffizienz->render( zRObj );
     antriebEffizienzSkill->render( zRObj );
-	laserIntensität->render( zRObj );
-	laserIntensitätSkill->render( zRObj );
-	laserEffizienz->render( zRObj );
-	laserEffizienzSkill->render( zRObj );
-	laserTempo->render( zRObj );
-	laserTempoSkill->render( zRObj );
+    laserIntensität->render( zRObj );
+    laserIntensitätSkill->render( zRObj );
+    laserEffizienz->render( zRObj );
+    laserEffizienzSkill->render( zRObj );
+    laserTempo->render( zRObj );
+    laserTempoSkill->render( zRObj );
     energieSchild->render( zRObj );
     energieSchildSkill->render( zRObj );
     energieSchildEffizienz->render( zRObj );
     energieSchildEffizienzSkill->render( zRObj );
-	netzwerk->render( zRObj );
-	netzwerkSkill->render( zRObj );
+    netzwerk->render( zRObj );
+    netzwerkSkill->render( zRObj );
     skillPoints->render( zRObj );
-	zRObj.releaseDrawOptions();
+    if( player )
+    {
+        Text txt( "Geschwindigkeit: " );
+        float sp = player->speed.getLength();
+        txt.setPrecision( getStellen( sp ) + 2 );
+        txt += sp;
+        txt += " p/s";
+        speed->setText( txt );
+        speed->render( zRObj );
+    }
+    zRObj.releaseDrawOptions();
 }
 
 // Reference Counting
 SpielerGUI *SpielerGUI::getThis()
 {
-	ref++;
-	return this;
+    ref++;
+    return this;
 }
 
 SpielerGUI *SpielerGUI::release()
 {
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
 }

+ 2 - 0
Asteroids/Spiel/SpielerGUI/SpielerGUI.h

@@ -27,6 +27,7 @@ private:
     TextFeld *energieSchild;
     TextFeld *energieSchildEffizienz;
 	TextFeld *netzwerk;
+    TextFeld *speed;
 	Knopf *stabilitätSkill;
 	Knopf *energieSkill;
 	Knopf *reparaturSkill;
@@ -41,6 +42,7 @@ private:
     Knopf *energieSchildEffizienzSkill;
 	Knopf *netzwerkSkill;
     TextFeld *skillPoints;
+    Spieler *player;
 	int ref;
 
 public: