Browse Source

Level hinzugefügt

Kolja Strohm 5 years ago
parent
commit
db90bae041

+ 38 - 34
Asteroids/Spiel/SpielKlasse.cpp

@@ -814,31 +814,29 @@ void SpielKlasse::stknVerarbeitung()
                         if( sNum >= 0 )
                         {
                             double intens = 0;
+                            Spieler *attacker = 0;
+                            Spieler *attacked = 0;
                             for( auto s = spieler->getIterator(); s; s++ )
                             {
+                                if( s->getSpielerNummer() == tmp->getSpieler() )
+                                    attacker = s;
                                 if( s->getSpielerNummer() == sNum )
-                                {
-                                    intens = tmp->getIntensität( s->getSpeed() );
-                                    s->nimmSchaden( intens );
-                                    if( tmp->getSpeed().getLengthSq() > 0 )
-                                        s->impuls( tmp->getPosition() - tmp->getSpeed(), tmp->getSpeed() * 0.3f );
-                                    s->calcDeadPlayerObject( schüsse->z( i ) );
-                                    bestenliste->updateSpieler( s );
-                                    break;
-                                }
+                                    attacked = s;
                             }
-                            for( auto s = spieler->getIterator(); s; s++ )
+                            if( attacked && attacker )
                             {
-                                if( s->getSpielerNummer() == tmp->getSpieler() )
-                                {
-                                    s->machSchaden( intens );
-                                    if( s->getEp() != erf )
-                                        chat->addNachricht( Text( "asynchrony detected ep difference: " ) += ( erf - s->getEp() ), 0xFFFF0000 );
-                                    if( s->getSkillP() != skillP )
-                                        chat->addNachricht( Text( "asynchrony detected skillPunkte difference: " ) += ( skillP - s->getSkillP() ), 0xFFFF0000 );
-                                    bestenliste->updateSpieler( s );
-                                    break;
-                                }
+                                intens = tmp->getIntensität( attacked->getSpeed() );
+                                attacked->nimmSchaden( intens, attacker ? attacker->getLevel() : 1 );
+                                if( tmp->getSpeed().getLengthSq() > 0 )
+                                    attacked->impuls( tmp->getPosition() - tmp->getSpeed(), tmp->getSpeed() * 0.3f );
+                                attacked->calcDeadPlayerObject( schüsse->z( i ) );
+                                bestenliste->updateSpieler( attacked );
+                                attacker->machSchaden( intens, attacked->getLevel() );
+                                if( attacker->getEp() != erf )
+                                    chat->addNachricht( Text( "asynchrony detected ep difference: " ) += ( erf - attacker->getEp() ), 0xFFFF0000 );
+                                if( attacker->getSkillP() != skillP )
+                                    chat->addNachricht( Text( "asynchrony detected skillPunkte difference: " ) += ( skillP - attacker->getSkillP() ), 0xFFFF0000 );
+                                bestenliste->updateSpieler( attacker );
                             }
                         }
                         welt->removeObject( tmp );
@@ -899,25 +897,31 @@ void SpielKlasse::stknVerarbeitung()
                 int killer = *(int *)bytes;
                 län -= 4;
                 goBackInTime( zeit );
+                Spieler *dead = 0;
+                Spieler *kill = 0;
                 for( auto s = spieler->getIterator(); s; s++ )
                 {
                     if( s->getSpielerNummer() == sNum )
-                    {
-                        DeadPlayer *dp = s->sterben();
-                        if( dp )
-                        {
-                            welt->addObject( dp->getThis() );
-                            deads->add( dp );
-                        }
-                        bestenliste->updateSpieler( s );
-                    }
+                        dead = s;
                     if( s->getSpielerNummer() == killer )
+                        kill = s;
+                }
+                if( dead )
+                {
+                    DeadPlayer *dp = dead->sterben();
+                    if( dp )
                     {
-                        s->addKill();
-                        s->zTeam()->punkte++;
-                        bestenliste->updateTeam( s->zTeam() );
-                        bestenliste->updateSpieler( s );
+                        welt->addObject( dp->getThis() );
+                        deads->add( dp );
                     }
+                    bestenliste->updateSpieler( dead );
+                }
+                if( kill )
+                {
+                    kill->addKill( dead->getLevel() );
+                    kill->zTeam()->punkte++;
+                    bestenliste->updateTeam( kill->zTeam() );
+                    bestenliste->updateSpieler( kill );
                 }
                 goToPresence( presence );
                 if( sNum == spielerNummer )
@@ -1012,7 +1016,7 @@ void SpielKlasse::stknVerarbeitung()
                             {
                                 if( s->getSpielerNummer() == tmp->getSpieler() )
                                 {
-                                    s->addTreffer( (float)tmp->getIntensität( a->getSpeed() ) );
+                                    s->addTreffer( (float)tmp->getIntensität( a->getSpeed() ), 0 );
                                     if( s->getEp() != erf )
                                         chat->addNachricht( Text( "asynchrony detected ep difference: " ) += ( erf - s->getEp() ), 0xFFFF0000 );
                                     if( s->getSkillP() != skillP )

+ 26 - 7
Asteroids/Spiel/Spieler/Spieler.cpp

@@ -19,6 +19,7 @@ Spieler::Spieler( KSGClient::InformationServerClient *zInfoK, Schrift *zSchrift,
     name = 0;
     for( int i = 0; i < T_MAX; i++ )
         tastatur[ i ] = 0;
+    level = 1;
     amLeben = 1;
     schussAbk = 0;
     energieAbk = 0;
@@ -325,6 +326,8 @@ void Spieler::renderLeben( const Mat3< float > & kamMat, Bild & zRObj )
     if( !zteam || !amLeben )
         return;
     nText->setPosition( (Punkt)( kamMat * getPosition() - Vertex( 76, ( zModel()->maxP.y * getSize() ) + 30 ) ) );
+    if( name )
+        nText->setText( Text( name->getText() ) + " (" + level + ")" );
     nText->render( zRObj );
     zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 4, 150, zteam->farbe );
     zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 25, 150, zteam->farbe );
@@ -416,8 +419,9 @@ void Spieler::setSkill( int art )
     }
 }
 
-void Spieler::nimmSchaden( double &intensität )
+void Spieler::nimmSchaden( double &intensität, int sLevel )
 {
+    double originalIntens = intensität;
     double schieldVal = intensität - intensität / ( energieSchild + zteam->energieSchild );
     double schieldEVal = schieldVal / ( ( energieSchildEffizienz + zteam->energieSchildEffizienz ) / 100 );
     if( schieldEVal > energie )
@@ -431,6 +435,11 @@ void Spieler::nimmSchaden( double &intensit
     schadenBekommen += intensität;
     energieAbk = 1.5;
     repAbk = 2;
+    if( stabilität > 0 )
+    {
+        float levelFactor = (float)sLevel / (float)level;
+        addEp( ( (float)originalIntens / 20 ) * levelFactor );
+    }
 }
 
 void Spieler::calcDeadPlayerObject( Laser * zSchuss )
@@ -463,17 +472,18 @@ void Spieler::calcDeadPlayerObject( Laser * zSchuss )
     }
 }
 
-void Spieler::machSchaden( double intensität )
+void Spieler::machSchaden( double intensität, int sLevel )
 {
     schadenGemacht += intensität;
-    addTreffer( (float)intensität );
+    addTreffer( (float)intensität, sLevel );
 }
 
-void Spieler::addKill()
+void Spieler::addKill( int sLevel )
 {
+    float levelFactor = (float)sLevel / (float)level;
+    addEp( 80 * levelFactor );
     kills++;
     punkte++;
-    skillPunkte += 2;
     maxReinkAbk--;
     if( maxReinkAbk < 5 )
         maxReinkAbk = 5;
@@ -520,10 +530,11 @@ void Spieler::hatGeschossen()
     schüsse++;
 }
 
-void Spieler::addTreffer( float indens )
+void Spieler::addTreffer( float indens, int sLevel )
 {
     treffer++;
-    addEp( indens / 10 );
+    float levelFactor = (float)sLevel / (float)level;
+    addEp( ( indens / 10 ) * levelFactor );
 }
 
 void Spieler::addEp( float ep )
@@ -531,6 +542,7 @@ void Spieler::addEp( float ep )
     this->ep += ep;
     while( this->ep >= nextSkillEp )
     {
+        level++;
         skillPunkte++;
         this->ep -= nextSkillEp;
         nextSkillEp *= 1.025f;
@@ -576,6 +588,7 @@ void Spieler::save()
     last.punkte = punkte;
     last.kills = kills;
     last.tode = tode;
+    last.level = level;
 }
 
 void Spieler::load()
@@ -618,6 +631,7 @@ void Spieler::load()
     punkte = last.punkte;
     kills = last.kills;
     tode = last.tode;
+    level = last.level;
 }
 
 // constant
@@ -785,4 +799,9 @@ double Spieler::getTeamEnergieSchildEffizienzBonus() const
 int Spieler::getSkillP() const
 {
     return skillPunkte;
+}
+
+int Spieler::getLevel() const
+{
+    return level;
 }

+ 7 - 4
Asteroids/Spiel/Spieler/Spieler.h

@@ -78,7 +78,9 @@ private:
         int punkte;
         int kills;
         int tode;
+        int level;
     };
+    int level;
     int farbe;
     bool amLeben;
     double schussAbk;
@@ -139,14 +141,14 @@ public:
 	void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) override;
 	void renderLeben( const Mat3< float > &kamMat, Bild &zRObj );
 	void setSkill( int art );
-	void nimmSchaden( double &intensität );
+	void nimmSchaden( double &intensität, int sLevel );
     void calcDeadPlayerObject( Laser *zSchuss );
-	void machSchaden( double intensität );
-	void addKill();
+	void machSchaden( double intensität, int sLevel );
+	void addKill( int sLevel );
     DeadPlayer *sterben();
 	void wiederbelebung();
 	void hatGeschossen();
-    void addTreffer( float indens );
+    void addTreffer( float indens, int sLevel );
     void addEp( float ep );
     void save();
     void load();
@@ -185,6 +187,7 @@ public:
     double getTeamEnergieSchildBonus() const;
     double getTeamEnergieSchildEffizienzBonus() const;
     int getSkillP() const;
+    int getLevel() const;
 };
 
 #endif