|
@@ -11,6 +11,7 @@
|
|
|
Spieler::Spieler( SpielerStr *zStr )
|
|
|
: Model2DObject()
|
|
|
{
|
|
|
+ activeSkills = new RCArray< ActiveSkill >();
|
|
|
accountId = 0;
|
|
|
sNum = zStr->id;
|
|
|
farbe = 0;
|
|
@@ -66,9 +67,165 @@ Spieler::~Spieler()
|
|
|
team->release();
|
|
|
if( klient )
|
|
|
klient->release();
|
|
|
+ activeSkills->release();
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateBeschleunigung()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getBeschleunigungFactor();
|
|
|
+ bonus += s->getBeschleunigungBonus();
|
|
|
+ }
|
|
|
+ return ( beschleunigung + team->beschleunigung ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateReparatur()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getReparaturFactor();
|
|
|
+ bonus += s->getReparaturBonus();
|
|
|
+ }
|
|
|
+ return ( reparatur + team->reparatur ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateLaserIntensity()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getLaserIntensityFactor();
|
|
|
+ bonus += s->getLaserIntensityBonus();
|
|
|
+ }
|
|
|
+ return ( laserIntensity + team->laserIntensity ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateLaserEffizienz()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getLaserEffizienzFactor();
|
|
|
+ bonus += s->getLaserEffizienzBonus();
|
|
|
+ }
|
|
|
+ return ( laserEffizienz + team->laserEffizienz ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateAkkuLeistung()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getAkkuLeistungFactor();
|
|
|
+ bonus += s->getAkkuLeistungBonus();
|
|
|
+ }
|
|
|
+ return ( akkuLeistung + team->akkuLeistung ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateMaxEnergie()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getMaxEnergieFactor();
|
|
|
+ bonus += s->getMaxEnergieBonus();
|
|
|
+ }
|
|
|
+ return ( maxEnergie + team->maxEnergie ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateMaxStability()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getMaxStabilityFactor();
|
|
|
+ bonus += s->getMaxStabilityBonus();
|
|
|
+ }
|
|
|
+ return ( maxStability + team->maxStability ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateLaserTempo()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getLaserTempoFactor();
|
|
|
+ bonus += s->getLaserTempoBonus();
|
|
|
+ }
|
|
|
+ return ( laserTempo + team->laserTempo ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateWendigkeit()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getWendigkeitFactor();
|
|
|
+ bonus += s->getWendigkeitBonus();
|
|
|
+ }
|
|
|
+ return ( wendigkeit + team->wendigkeit ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateAntriebEffizienz()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getAntriebEffizienzFactor();
|
|
|
+ bonus += s->getAntriebEffizienzBonus();
|
|
|
+ }
|
|
|
+ return ( antriebEffizienz + team->antriebEffizienz ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateEnergieSchild()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getEnergieSchildFactor();
|
|
|
+ bonus += s->getEnergieSchildBonus();
|
|
|
+ }
|
|
|
+ return ( energieSchild + team->energieSchild ) * factor + bonus;
|
|
|
+}
|
|
|
+
|
|
|
+double Spieler::calculateEnergieSchildEffizienz()
|
|
|
+{
|
|
|
+ double factor = 1;
|
|
|
+ double bonus = 0;
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ {
|
|
|
+ factor *= s->getEnergieSchildEffizienzFactor();
|
|
|
+ bonus += s->getEnergieSchildEffizienzBonus();
|
|
|
+ }
|
|
|
+ return ( energieSchildEffizienz + team->energieSchildEffizienz ) * factor + bonus;
|
|
|
}
|
|
|
|
|
|
// nicht constant
|
|
|
+void Spieler::addSkill( ActiveSkill *skill )
|
|
|
+{
|
|
|
+ activeSkills->add( skill );
|
|
|
+}
|
|
|
+
|
|
|
+void Spieler::useSkill( int id )
|
|
|
+{
|
|
|
+ if( activeSkills->z( id ) )
|
|
|
+ activeSkills->z( id )->activate();
|
|
|
+}
|
|
|
+
|
|
|
void Spieler::offline()
|
|
|
{
|
|
|
klient->offline();
|
|
@@ -185,6 +342,8 @@ bool Spieler::tick( const WeltInfo& info, double zeit )
|
|
|
}
|
|
|
if( amLeben )
|
|
|
{
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ s->tick( zeit );
|
|
|
schussAbk -= zeit;
|
|
|
energieAbk -= zeit;
|
|
|
if( schussAbk < 0 )
|
|
@@ -196,52 +355,52 @@ bool Spieler::tick( const WeltInfo& info, double zeit )
|
|
|
repAbk = 0;
|
|
|
if( tastatur[ T_GAS ] )
|
|
|
{
|
|
|
- double treibstoff = 0.5 * ( ( beschleunigung + team->beschleunigung ) / 15 )
|
|
|
- * zeit * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
|
|
|
+ double treibstoff = 0.5 * ( calculateBeschleunigung() / 15 )
|
|
|
+ * zeit * ( 100 / calculateAntriebEffizienz() );
|
|
|
treibstoffVerbraucht += treibstoff;
|
|
|
float factor = 1;
|
|
|
if( treibstoff > energie )
|
|
|
factor = (float)( energie / treibstoff );
|
|
|
if( factor > 0 )
|
|
|
- impuls( getWorldPos( stM ), getWorldDir( kM ) * (float)zeit * (float)( beschleunigung + team->beschleunigung ) * factor );
|
|
|
+ impuls( getWorldPos( stM ), getWorldDir( kM ) * (float)zeit * (float)calculateBeschleunigung() * factor );
|
|
|
energie -= treibstoff * factor;
|
|
|
}
|
|
|
if( tastatur[ T_ROT_R ] )
|
|
|
{
|
|
|
- double treibstoff = 0.25 * ( ( wendigkeit + team->wendigkeit ) / 15 )
|
|
|
- * zeit * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
|
|
|
+ double treibstoff = 0.25 * ( calculateWendigkeit() / 15 )
|
|
|
+ * zeit * ( 100 / calculateAntriebEffizienz() );
|
|
|
treibstoffVerbraucht += treibstoff;
|
|
|
float factor = 1;
|
|
|
if( treibstoff > energie )
|
|
|
factor = (float)( energie / treibstoff );
|
|
|
if( factor > 0 )
|
|
|
- impuls( getWorldPos( stL ), getWorldDir( kL ) * (float)zeit * (float)( wendigkeit + team->wendigkeit ) * factor );
|
|
|
+ impuls( getWorldPos( stL ), getWorldDir( kL ) * (float)zeit * (float)calculateWendigkeit() * factor );
|
|
|
energie -= treibstoff * factor;
|
|
|
}
|
|
|
if( tastatur[ T_ROT_L ] )
|
|
|
{
|
|
|
- double treibstoff = 0.25 * ( ( wendigkeit + team->wendigkeit ) / 15 )
|
|
|
- * zeit * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
|
|
|
+ double treibstoff = 0.25 * ( calculateWendigkeit() / 15 )
|
|
|
+ * zeit * ( 100 / calculateAntriebEffizienz() );
|
|
|
treibstoffVerbraucht += treibstoff;
|
|
|
float factor = 1;
|
|
|
if( treibstoff > energie )
|
|
|
factor = (float)( energie / treibstoff );
|
|
|
if( factor > 0 )
|
|
|
- impuls( getWorldPos( stR ), getWorldDir( kR ) * (float)zeit * (float)( wendigkeit + team->wendigkeit ) * factor );
|
|
|
+ impuls( getWorldPos( stR ), getWorldDir( kR ) * (float)zeit * (float)calculateWendigkeit() * factor );
|
|
|
energie -= treibstoff * factor;
|
|
|
}
|
|
|
Model2DObject::tick( info, zeit );
|
|
|
if( !energieAbk )
|
|
|
{
|
|
|
- energie += ( akkuLeistung + team->akkuLeistung ) * zeit;
|
|
|
- if( energie > ( maxEnergie + team->maxEnergie ) )
|
|
|
- energie = ( maxEnergie + team->maxEnergie );
|
|
|
+ energie += calculateAkkuLeistung() * zeit;
|
|
|
+ if( energie > calculateMaxEnergie() )
|
|
|
+ energie = calculateMaxEnergie();
|
|
|
}
|
|
|
if( !repAbk )
|
|
|
{
|
|
|
- stability += ( reparatur + team->reparatur ) * zeit;
|
|
|
- if( stability > ( maxStability + team->maxStability ) )
|
|
|
- stability = ( maxStability + team->maxStability );
|
|
|
+ stability += calculateReparatur() * zeit;
|
|
|
+ if( stability > calculateMaxStability() )
|
|
|
+ stability = calculateMaxStability();
|
|
|
}
|
|
|
zeitAmLeben += zeit;
|
|
|
}
|
|
@@ -329,9 +488,9 @@ Laser *Spieler::getLaser( int sId )
|
|
|
{
|
|
|
if( !amLeben || !tastatur[ T_FEUER ] || schussAbk || !team )
|
|
|
return 0;
|
|
|
- double kosten = ( ( laserIntensity + team->laserIntensity ) / 2 +
|
|
|
- ( laserTempo + team->laserTempo ) / 9 ) *
|
|
|
- ( 1 / ( ( laserEffizienz + team->laserEffizienz ) / 25 ) );
|
|
|
+ double kosten = ( calculateLaserIntensity() / 2 +
|
|
|
+ calculateLaserTempo() / 9 ) *
|
|
|
+ ( 1 / ( calculateLaserEffizienz() / 25 ) );
|
|
|
if( kosten < 1 )
|
|
|
kosten = 1;
|
|
|
if( kosten > energie )
|
|
@@ -340,20 +499,20 @@ Laser *Spieler::getLaser( int sId )
|
|
|
schussAbk = 1;
|
|
|
energieAbk = 1.5;
|
|
|
shots++;
|
|
|
- Vertex sSpeed = ( Vertex( lowPrecisionCos( rotation ), lowPrecisionSin( rotation ) ) * (float)( laserTempo + team->laserTempo ) );
|
|
|
+ Vertex sSpeed = ( Vertex( lowPrecisionCos( rotation ), lowPrecisionSin( rotation ) ) * (float)calculateLaserTempo() );
|
|
|
sSpeed += speed;
|
|
|
- return new Laser( sId, getPosition(), sSpeed, sNum, laserIntensity + team->laserIntensity );
|
|
|
+ return new Laser( sId, getPosition(), sSpeed, sNum, calculateLaserIntensity() );
|
|
|
}
|
|
|
|
|
|
bool Spieler::nimmSchaden( double &intensity, int sLevel )
|
|
|
{
|
|
|
double originalIntens = intensity;
|
|
|
- double schieldVal = intensity - intensity / ( energieSchild + team->energieSchild );
|
|
|
- double schieldEVal = schieldVal / ( ( energieSchildEffizienz + team->energieSchildEffizienz ) / 100 );
|
|
|
+ double schieldVal = intensity - intensity / calculateEnergieSchild();
|
|
|
+ double schieldEVal = schieldVal / ( calculateEnergieSchildEffizienz() / 100 );
|
|
|
if( schieldEVal > energie )
|
|
|
{
|
|
|
schieldEVal = energie;
|
|
|
- schieldVal = schieldEVal * ( ( energieSchildEffizienz + team->energieSchildEffizienz ) / 100 );
|
|
|
+ schieldVal = schieldEVal * ( calculateEnergieSchildEffizienz() / 100 );
|
|
|
}
|
|
|
intensity -= schieldVal;
|
|
|
energie -= schieldEVal;
|
|
@@ -405,11 +564,13 @@ void Spieler::addTreffer( float intensity, int sLevel )
|
|
|
|
|
|
void Spieler::wiederbeleben()
|
|
|
{
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
+ s->reset();
|
|
|
needWiederbelebung = 0;
|
|
|
setPosition( startPos );
|
|
|
reinkAbk = maxReinkAbk * 2;
|
|
|
- energie = maxEnergie + team->maxEnergie;
|
|
|
- stability = maxStability + team->maxStability;
|
|
|
+ energie = calculateMaxEnergie();
|
|
|
+ stability = calculateMaxStability();
|
|
|
schussAbk = 0;
|
|
|
energieAbk = 0;
|
|
|
repAbk = 0;
|