소스 검색

Level hinzugefügt

Kolja Strohm 5 년 전
부모
커밋
8c1743b04e
3개의 변경된 파일42개의 추가작업 그리고 27개의 파일을 삭제
  1. 16 18
      Asteroids/Spiel.cpp
  2. 21 6
      Asteroids/Spieler.cpp
  3. 5 3
      Asteroids/Spieler.h

+ 16 - 18
Asteroids/Spiel.cpp

@@ -384,32 +384,30 @@ void Spiel::tick( double zeit )
                 int team = getTeamVonSpieler( tmp->getSpieler() );
                 for( int j = 0; j < spielerAnzahl; j++ )
                 {
-                    Spieler *s = spieler->z( j );
-                    if( s && s->zTeam() && s->zTeam()->id != team && s->istTreffer( tmp->getPosition() ) )
+                    Spieler *attacked = spieler->z( j );
+                    if( attacked && attacked->zTeam() && attacked->zTeam()->id != team && attacked->istTreffer( tmp->getPosition() ) )
                     { // Treffer
-                        double intens = tmp->getIntensity() * ( ( tmp->getSpeed() - s->getSpeed() ).getLength() / 200 );
-                        bool kill = s->nimmSchaden( intens );
-                        if( tmp->getSpeed().getLengthSq() > 0 )
-                            s->impuls( tmp->getPosition() - tmp->getSpeed(), tmp->getSpeed() * 0.3f );
-                        float erf = 0;
-                        int skillP = 0;
+                        Spieler *attacker = 0;
                         for( int k = 0; k < spielerAnzahl; k++ )
                         {
-                            Spieler *sp = spieler->z( k );
-                            if( sp && sp->getSpielerNummer() == tmp->getSpieler() )
-                            {
-                                skillP = sp->getSkillP();
-                                sp->machSchaden( intens, kill );
-                                erf = sp->getEp();
-                            }
+                            Spieler *tmpS = spieler->z( k );
+                            if( tmpS && tmpS->getSpielerNummer() == tmp->getSpieler() )
+                                attacker = tmpS;
                         }
+                        double intens = tmp->getIntensity() * ( ( tmp->getSpeed() - attacked->getSpeed() ).getLength() / 200 );
+                        bool kill = attacked->nimmSchaden( intens, attacker ? attacker->getLevel() : 1 );
+                        if( tmp->getSpeed().getLengthSq() > 0 )
+                            attacked->impuls( tmp->getPosition() - tmp->getSpeed(), tmp->getSpeed() * 0.3f );
+                        int skillP = attacker->getSkillP();
+                        attacker->machSchaden( intens, kill, attacked->getLevel() );
+                        float erf = attacker->getEp();
                         for( int k = 0; k < spielerAnzahl; k++ )
                         {
                             Spieler *sp = spieler->z( k );
                             if( sp )
-                                sp->zKlient()->sendeTreffer( tmp->getId(), s->getSpielerNummer(), spielZeit, erf, skillP );
+                                sp->zKlient()->sendeTreffer( tmp->getId(), attacked->getSpielerNummer(), spielZeit, erf, skillP );
                             if( kill && sp )
-                                sp->zKlient()->sendeTod( s->getSpielerNummer(), tmp->getSpieler(), spielZeit );
+                                sp->zKlient()->sendeTod( attacked->getSpielerNummer(), tmp->getSpieler(), spielZeit );
                         }
                         if( kill )
                         {
@@ -442,7 +440,7 @@ void Spiel::tick( double zeit )
                             Spieler *s = spieler->z( k );
                             if( s && s->getSpielerNummer() == tmp->getSpieler() )
                             {
-                                s->addTreffer( (float)intens );
+                                s->addTreffer( (float)intens, 0 );
                                 erf = s->getEp();
                                 skillP = s->getSkillP();
                             }

+ 21 - 6
Asteroids/Spieler.cpp

@@ -16,6 +16,7 @@ Spieler::Spieler( SpielerStr *zStr )
     farbe = 0;
     team = 0;
     klient = 0;
+    level = 1;
     for( int i = 0; i < T_MAX; i++ )
         tastatur[ i ] = 0;
     amLeben = 1;
@@ -344,8 +345,9 @@ Laser *Spieler::getLaser( int sId )
     return new Laser( sId, getPosition(), sSpeed, sNum, laserIntensity + team->laserIntensity );
 }
 
-bool Spieler::nimmSchaden( double &intensity )
+bool Spieler::nimmSchaden( double &intensity, int sLevel )
 {
+    double originalIntens = intensity;
     double schieldVal = intensity - intensity / ( energieSchild + team->energieSchild );
     double schieldEVal = schieldVal / ( ( energieSchildEffizienz + team->energieSchildEffizienz ) / 100 );
     if( schieldEVal > energie )
@@ -369,16 +371,22 @@ bool Spieler::nimmSchaden( double &intensity )
         maxReinkAbk++;
         punkte--;
     }
+    else
+    {
+        float levelFactor = (float)sLevel / (float)level;
+        addEp( ( (float)originalIntens / 20 ) * levelFactor );
+    }
     return stability == 0;
 }
 
-void Spieler::machSchaden( double intensity, bool kill )
+void Spieler::machSchaden( double intensity, bool kill, int sLevel )
 {
     schadenGemacht += intensity;
-    addTreffer( (float)intensity );
+    addTreffer( (float)intensity, sLevel );
     if( kill )
     {
-        skillPunkte += 2;
+        float levelFactor = (float)sLevel / (float)level;
+        addEp( 80 * levelFactor );
         kills++;
         punkte++;
         maxReinkAbk--;
@@ -387,10 +395,11 @@ void Spieler::machSchaden( double intensity, bool kill )
     }
 }
 
-void Spieler::addTreffer( float intensity )
+void Spieler::addTreffer( float intensity, int sLevel )
 {
     treffer++;
-    addEp( intensity / 10 );
+    float levelFactor = (float)sLevel / (float)level;
+    addEp( ( intensity / 10 ) * levelFactor );
 }
 
 void Spieler::wiederbeleben()
@@ -417,6 +426,7 @@ void Spieler::addEp( float ep )
     this->ep += ep;
     while( this->ep >= nextSkillEp )
     {
+        level++;
         skillPunkte++;
         this->ep -= nextSkillEp;
         nextSkillEp *= 1.025f;
@@ -595,6 +605,11 @@ int Spieler::getSkillP() const
     return skillPunkte;
 }
 
+int Spieler::getLevel() const
+{
+    return level;
+}
+
 // Reference Counting
 Spieler *Spieler::getThis()
 {

+ 5 - 3
Asteroids/Spieler.h

@@ -34,6 +34,7 @@ private:
     Vertex kM;
     WeltInfo wInfo;
 
+    int level;
 	int accountId;
 	int sNum;
 	int farbe;
@@ -96,9 +97,9 @@ public:
 	bool tick( const WeltInfo &info, double zeit ) override;
 	bool setSkill( int art );
 	Laser *getLaser( int sId );
-	bool nimmSchaden( double &intensity );
-	void machSchaden( double intensity, bool kill );
-    void addTreffer( float intensity );
+	bool nimmSchaden( double &intensity, int sLevel );
+	void machSchaden( double intensity, bool kill, int sLevel );
+    void addTreffer( float intensity, int sLevel );
     void wiederbeleben();
     void addEp( float ep );
 	// constant
@@ -137,6 +138,7 @@ public:
     bool doNeedWiederbelebung() const;
     float getEp() const;
     int getSkillP() const;
+    int getLevel() const;
 	// Reference Counting
 	Spieler *getThis();
 	Spieler *release();