|
@@ -10,6 +10,7 @@
|
|
Spieler::Spieler( KSGClient::InformationServerClient *zInfoK, Schrift *zSchrift, SpielerStr *zStr )
|
|
Spieler::Spieler( KSGClient::InformationServerClient *zInfoK, Schrift *zSchrift, SpielerStr *zStr )
|
|
: Model2DObject()
|
|
: Model2DObject()
|
|
{
|
|
{
|
|
|
|
+ activeSkills = new RCArray< ActiveSkill >();
|
|
deadPlayer = 0;
|
|
deadPlayer = 0;
|
|
accountId = 0;
|
|
accountId = 0;
|
|
sNum = zStr->id;
|
|
sNum = zStr->id;
|
|
@@ -74,19 +75,175 @@ Spieler::~Spieler()
|
|
nText->release();
|
|
nText->release();
|
|
if( deadPlayer )
|
|
if( deadPlayer )
|
|
deadPlayer->release();
|
|
deadPlayer->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 + zteam->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 + zteam->reparatur ) * factor + bonus;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+double Spieler::calculateLaserIntensität()
|
|
|
|
+{
|
|
|
|
+ double factor = 1;
|
|
|
|
+ double bonus = 0;
|
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
|
+ {
|
|
|
|
+ factor *= s->getLaserIntensitätFactor();
|
|
|
|
+ bonus += s->getLaserIntensitätBonus();
|
|
|
|
+ }
|
|
|
|
+ return ( laserIntensität + zteam->laserIntensität ) * 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 + zteam->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 + zteam->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 + zteam->maxEnergie ) * factor + bonus;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+double Spieler::calculateMaxStabilität()
|
|
|
|
+{
|
|
|
|
+ double factor = 1;
|
|
|
|
+ double bonus = 0;
|
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
|
+ {
|
|
|
|
+ factor *= s->getMaxStabilitätFactor();
|
|
|
|
+ bonus += s->getMaxStabilitätBonus();
|
|
|
|
+ }
|
|
|
|
+ return ( maxStabilität + zteam->maxStabilität ) * 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 + zteam->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 + zteam->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 + zteam->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 + zteam->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 + zteam->energieSchildEffizienz ) * factor + bonus;
|
|
}
|
|
}
|
|
|
|
|
|
double Spieler::calculateLaserCost()
|
|
double Spieler::calculateLaserCost()
|
|
{
|
|
{
|
|
- double kosten = ( ( laserIntensität + zteam->laserIntensität ) / 2 +
|
|
|
|
- ( laserTempo + zteam->laserTempo ) / 9 ) *
|
|
|
|
- ( 1 / ( ( laserEffizienz + zteam->laserEffizienz ) / 25 ) );
|
|
|
|
|
|
+ double kosten = ( calculateLaserIntensität() / 2 +
|
|
|
|
+ calculateLaserTempo() / 9 ) *
|
|
|
|
+ ( 1 / ( calculateLaserEffizienz() / 25 ) );
|
|
if( kosten < 1 )
|
|
if( kosten < 1 )
|
|
kosten = 1;
|
|
kosten = 1;
|
|
return kosten;
|
|
return kosten;
|
|
}
|
|
}
|
|
|
|
|
|
// nicht constant
|
|
// 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::setModelData( Model2DData * data, Animation2DData * zFStart, Animation2DData * zFBurn )
|
|
void Spieler::setModelData( Model2DData * data, Animation2DData * zFStart, Animation2DData * zFBurn )
|
|
{
|
|
{
|
|
for( auto i = data->polygons->getIterator(); i; i++ )
|
|
for( auto i = data->polygons->getIterator(); i; i++ )
|
|
@@ -166,7 +323,7 @@ void Spieler::setAccountId( int accId )
|
|
nText->setText( *name );
|
|
nText->setText( *name );
|
|
}
|
|
}
|
|
|
|
|
|
-void Spieler::setTeam( Team *zTeam )
|
|
|
|
|
|
+void Spieler::setTeam( Team * zTeam )
|
|
{
|
|
{
|
|
this->zteam = zTeam;
|
|
this->zteam = zTeam;
|
|
nText->setHintergrundFarbe( 0xA0000000 | ( zteam->farbe & 0x00FFFFFF ) );
|
|
nText->setHintergrundFarbe( 0xA0000000 | ( zteam->farbe & 0x00FFFFFF ) );
|
|
@@ -242,6 +399,8 @@ bool Spieler::tick( const WeltInfo & info, double tv )
|
|
flammenR->tick( tv );
|
|
flammenR->tick( tv );
|
|
if( amLeben )
|
|
if( amLeben )
|
|
{
|
|
{
|
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
|
+ s->tick( tv );
|
|
schussAbk -= tv;
|
|
schussAbk -= tv;
|
|
energieAbk -= tv;
|
|
energieAbk -= tv;
|
|
if( schussAbk < 0 )
|
|
if( schussAbk < 0 )
|
|
@@ -253,56 +412,56 @@ bool Spieler::tick( const WeltInfo & info, double tv )
|
|
repAbk = 0;
|
|
repAbk = 0;
|
|
if( tastatur[ T_GAS ] )
|
|
if( tastatur[ T_GAS ] )
|
|
{
|
|
{
|
|
- double treibstoff = 0.5 * ( ( beschleunigung + zteam->beschleunigung ) / 15 )
|
|
|
|
- * tv * ( 100 / ( antriebEffizienz + zteam->antriebEffizienz ) );
|
|
|
|
|
|
+ double treibstoff = 0.5 * ( calculateBeschleunigung() / 15 )
|
|
|
|
+ * tv * ( 100 / calculateAntriebEffizienz() );
|
|
treibstoffVerbraucht += treibstoff;
|
|
treibstoffVerbraucht += treibstoff;
|
|
float factor = 1;
|
|
float factor = 1;
|
|
if( treibstoff > energie )
|
|
if( treibstoff > energie )
|
|
factor = (float)( energie / treibstoff );
|
|
factor = (float)( energie / treibstoff );
|
|
if( factor > 0 )
|
|
if( factor > 0 )
|
|
- impuls( getWorldPos( stM ), getWorldDir( kM ) * (float)tv * (float)( beschleunigung + zteam->beschleunigung ) * factor );
|
|
|
|
|
|
+ impuls( getWorldPos( stM ), getWorldDir( kM ) * (float)tv * (float)calculateBeschleunigung() * factor );
|
|
energie -= treibstoff * factor;
|
|
energie -= treibstoff * factor;
|
|
}
|
|
}
|
|
if( tastatur[ T_ROT_R ] )
|
|
if( tastatur[ T_ROT_R ] )
|
|
{
|
|
{
|
|
- double treibstoff = 0.25 * ( ( wendigkeit + zteam->wendigkeit ) / 15 )
|
|
|
|
- * tv * ( 100 / ( antriebEffizienz + zteam->antriebEffizienz ) );
|
|
|
|
|
|
+ double treibstoff = 0.25 * ( calculateWendigkeit() / 15 )
|
|
|
|
+ * tv * ( 100 / calculateAntriebEffizienz() );
|
|
treibstoffVerbraucht += treibstoff;
|
|
treibstoffVerbraucht += treibstoff;
|
|
float factor = 1;
|
|
float factor = 1;
|
|
if( treibstoff > energie )
|
|
if( treibstoff > energie )
|
|
factor = (float)( energie / treibstoff );
|
|
factor = (float)( energie / treibstoff );
|
|
if( factor > 0 )
|
|
if( factor > 0 )
|
|
- impuls( getWorldPos( stL ), getWorldDir( kL ) * (float)tv * (float)( wendigkeit + zteam->wendigkeit ) * factor );
|
|
|
|
|
|
+ impuls( getWorldPos( stL ), getWorldDir( kL ) * (float)tv * (float)calculateWendigkeit() * factor );
|
|
energie -= treibstoff * factor;
|
|
energie -= treibstoff * factor;
|
|
}
|
|
}
|
|
if( tastatur[ T_ROT_L ] )
|
|
if( tastatur[ T_ROT_L ] )
|
|
{
|
|
{
|
|
- double treibstoff = 0.25 * ( ( wendigkeit + zteam->wendigkeit ) / 15 )
|
|
|
|
- * tv * ( 100 / ( antriebEffizienz + zteam->antriebEffizienz ) );
|
|
|
|
|
|
+ double treibstoff = 0.25 * ( calculateWendigkeit() / 15 )
|
|
|
|
+ * tv * ( 100 / calculateAntriebEffizienz() );
|
|
treibstoffVerbraucht += treibstoff;
|
|
treibstoffVerbraucht += treibstoff;
|
|
float factor = 1;
|
|
float factor = 1;
|
|
if( treibstoff > energie )
|
|
if( treibstoff > energie )
|
|
factor = (float)( energie / treibstoff );
|
|
factor = (float)( energie / treibstoff );
|
|
if( factor > 0 )
|
|
if( factor > 0 )
|
|
- impuls( getWorldPos( stR ), getWorldDir( kR ) * (float)tv * (float)( wendigkeit + zteam->wendigkeit ) * factor );
|
|
|
|
|
|
+ impuls( getWorldPos( stR ), getWorldDir( kR ) * (float)tv * (float)calculateWendigkeit() * factor );
|
|
energie -= treibstoff * factor;
|
|
energie -= treibstoff * factor;
|
|
}
|
|
}
|
|
__super::tick( info, tv );
|
|
__super::tick( info, tv );
|
|
if( !energieAbk )
|
|
if( !energieAbk )
|
|
{
|
|
{
|
|
- if( energie != ( maxEnergie + zteam->maxEnergie ) )
|
|
|
|
|
|
+ if( energie != calculateMaxEnergie() )
|
|
ret = 1;
|
|
ret = 1;
|
|
- energie += ( akkuLeistung + zteam->akkuLeistung ) * tv;
|
|
|
|
- if( energie > ( maxEnergie + zteam->maxEnergie ) )
|
|
|
|
- energie = ( maxEnergie + zteam->maxEnergie );
|
|
|
|
|
|
+ energie += calculateAkkuLeistung() * tv;
|
|
|
|
+ if( energie > calculateMaxEnergie() )
|
|
|
|
+ energie = calculateMaxEnergie();
|
|
}
|
|
}
|
|
if( !repAbk )
|
|
if( !repAbk )
|
|
{
|
|
{
|
|
- if( stabilität != ( maxStabilität + zteam->maxStabilität ) )
|
|
|
|
|
|
+ if( stabilität != calculateMaxStabilität() )
|
|
ret = 1;
|
|
ret = 1;
|
|
- stabilität += ( reparatur + zteam->reparatur ) * tv;
|
|
|
|
- if( stabilität > ( maxStabilität + zteam->maxStabilität ) )
|
|
|
|
- stabilität = ( maxStabilität + zteam->maxStabilität );
|
|
|
|
|
|
+ stabilität += calculateReparatur() * tv;
|
|
|
|
+ if( stabilität > calculateMaxStabilität() )
|
|
|
|
+ stabilität = calculateMaxStabilität();
|
|
}
|
|
}
|
|
zeitAmLeben += tv;
|
|
zeitAmLeben += tv;
|
|
}
|
|
}
|
|
@@ -331,15 +490,15 @@ void Spieler::renderLeben( const Mat3< float > & kamMat, Bild & zRObj )
|
|
nText->render( zRObj );
|
|
nText->render( zRObj );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 4, 150, zteam->farbe );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 4, 150, zteam->farbe );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 25, 150, zteam->farbe );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 25, 150, zteam->farbe );
|
|
- int l = (int)( stabilität * 100 / ( maxStabilität + zteam->maxStabilität ) * 1.5 + 0.5 );
|
|
|
|
|
|
+ int l = (int)( stabilität * 100 / calculateMaxStabilität() * 1.5 + 0.5 );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 1, l, 0xFF00FF00 );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 1, l, 0xFF00FF00 );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 2, l, 0xFF00FF00 );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 2, l, 0xFF00FF00 );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 3, l, 0xFF00FF00 );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 3, l, 0xFF00FF00 );
|
|
- int e = (int)( energie * 100 / ( maxEnergie + zteam->maxEnergie ) * 1.5 + 0.5 );
|
|
|
|
|
|
+ int e = (int)( energie * 100 / calculateMaxEnergie() * 1.5 + 0.5 );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 26, e, 0xFF0000FF );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 26, e, 0xFF0000FF );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 27, e, 0xFF0000FF );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 27, e, 0xFF0000FF );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 28, e, 0xFF0000FF );
|
|
zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 28, e, 0xFF0000FF );
|
|
- int e2 = (int)( ( energie - calculateLaserCost() ) * 100 / ( maxEnergie + zteam->maxEnergie ) * 1.5 + 0.5 );
|
|
|
|
|
|
+ int e2 = (int)( ( energie - calculateLaserCost() ) * 100 / calculateMaxEnergie() * 1.5 + 0.5 );
|
|
if( e2 > 0 )
|
|
if( e2 > 0 )
|
|
{
|
|
{
|
|
zRObj.drawLinieV( nText->getX() + e2, nText->getY() + 26, 3, 0xFFFFFFFF );
|
|
zRObj.drawLinieV( nText->getX() + e2, nText->getY() + 26, 3, 0xFFFFFFFF );
|
|
@@ -422,12 +581,12 @@ void Spieler::setSkill( int art )
|
|
void Spieler::nimmSchaden( double &intensität, int sLevel )
|
|
void Spieler::nimmSchaden( double &intensität, int sLevel )
|
|
{
|
|
{
|
|
double originalIntens = intensität;
|
|
double originalIntens = intensität;
|
|
- double schieldVal = intensität - intensität / ( energieSchild + zteam->energieSchild );
|
|
|
|
- double schieldEVal = schieldVal / ( ( energieSchildEffizienz + zteam->energieSchildEffizienz ) / 100 );
|
|
|
|
|
|
+ double schieldVal = intensität - intensität / calculateEnergieSchild();
|
|
|
|
+ double schieldEVal = schieldVal / ( calculateEnergieSchildEffizienz() / 100 );
|
|
if( schieldEVal > energie )
|
|
if( schieldEVal > energie )
|
|
{
|
|
{
|
|
schieldEVal = energie;
|
|
schieldEVal = energie;
|
|
- schieldVal = schieldEVal * ( ( energieSchildEffizienz + zteam->energieSchildEffizienz ) / 100 );
|
|
|
|
|
|
+ schieldVal = schieldEVal * ( calculateEnergieSchildEffizienz() / 100 );
|
|
}
|
|
}
|
|
intensität -= schieldVal;
|
|
intensität -= schieldVal;
|
|
energie -= schieldEVal;
|
|
energie -= schieldEVal;
|
|
@@ -503,10 +662,12 @@ DeadPlayer *Spieler::sterben()
|
|
|
|
|
|
void Spieler::wiederbelebung()
|
|
void Spieler::wiederbelebung()
|
|
{
|
|
{
|
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
|
+ s->reset();
|
|
setPosition( startPos );
|
|
setPosition( startPos );
|
|
reinkAbk = maxReinkAbk * 2;
|
|
reinkAbk = maxReinkAbk * 2;
|
|
- energie = maxEnergie + zteam->maxEnergie;
|
|
|
|
- stabilität = maxStabilität + zteam->maxStabilität;
|
|
|
|
|
|
+ energie = calculateMaxEnergie();
|
|
|
|
+ stabilität = calculateMaxStabilität();
|
|
schussAbk = 0;
|
|
schussAbk = 0;
|
|
energieAbk = 0;
|
|
energieAbk = 0;
|
|
repAbk = 0;
|
|
repAbk = 0;
|
|
@@ -589,6 +750,8 @@ void Spieler::save()
|
|
last.kills = kills;
|
|
last.kills = kills;
|
|
last.tode = tode;
|
|
last.tode = tode;
|
|
last.level = level;
|
|
last.level = level;
|
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
|
+ s->save();
|
|
}
|
|
}
|
|
|
|
|
|
void Spieler::load()
|
|
void Spieler::load()
|
|
@@ -632,6 +795,8 @@ void Spieler::load()
|
|
kills = last.kills;
|
|
kills = last.kills;
|
|
tode = last.tode;
|
|
tode = last.tode;
|
|
level = last.level;
|
|
level = last.level;
|
|
|
|
+ for( auto s = activeSkills->getIterator(); s; s++ )
|
|
|
|
+ s->load();
|
|
}
|
|
}
|
|
|
|
|
|
// constant
|
|
// constant
|