Spieler.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. #include "Spieler.h"
  2. #include "Team.h"
  3. #include "Laser.h"
  4. #include "Karte.h"
  5. #include "SSKlient.h"
  6. #include <iostream>
  7. // Inhalt der Spieler Klasse aus Spieler.h
  8. // Konstruktor
  9. Spieler::Spieler( SpielerStr *zStr )
  10. : Model2DObject()
  11. {
  12. accountId = 0;
  13. sNum = zStr->id;
  14. farbe = 0;
  15. team = 0;
  16. klient = 0;
  17. for( int i = 0; i < T_MAX; i++ )
  18. tastatur[ i ] = 0;
  19. amLeben = 1;
  20. schussAbk = 0;
  21. energieAbk = 0;
  22. repAbk = 0;
  23. reinkAbk = 0;
  24. maxReinkAbk = 5;
  25. startPos = zStr->pos;
  26. beschleunigung = zStr->beschleunigung;
  27. beschleunigungStart = zStr->beschleunigung;
  28. energie = zStr->maxEnergie;
  29. stability = zStr->maxStability;
  30. reparatur = zStr->reparatur;
  31. laserIntensity = zStr->laserIntensity;
  32. laserEffizienz = zStr->laserEffizienz;
  33. akkuLeistung = zStr->akkuLeistung;
  34. akkuLeistungStart = zStr->akkuLeistung;
  35. maxEnergie = zStr->maxEnergie;
  36. maxStability = zStr->maxStability;
  37. laserTempo = zStr->laserTempo;
  38. netzwerk = zStr->netzwerk;
  39. wendigkeit = zStr->wendigkeit;
  40. wendigkeitStart = zStr->wendigkeit;
  41. antriebEffizienz = zStr->antriebEffizienz;
  42. energieSchild = zStr->energieSchild;
  43. energieSchildEffizienz = zStr->energieSchild;
  44. skillPunkte = zStr->skillPunkte;
  45. schadenBekommen = 0;
  46. schadenGemacht = 0;
  47. treibstoffVerbraucht = 0;
  48. shots = 0;
  49. treffer = 0;
  50. punkte = 0;
  51. kills = 0;
  52. tode = 0;
  53. zeitAmLeben = 0;
  54. zeitTod = 0;
  55. needWiederbelebung = 0;
  56. }
  57. // Destruktor
  58. Spieler::~Spieler()
  59. {
  60. if( team )
  61. team->release();
  62. if( klient )
  63. klient->release();
  64. }
  65. // nicht constant
  66. void Spieler::offline()
  67. {
  68. klient->offline();
  69. }
  70. void Spieler::online( SSKlientV *zKlient )
  71. {
  72. klient->online( zKlient );
  73. }
  74. void Spieler::setModelData( Model2DData *data )
  75. {
  76. for( auto i = data->polygons->getIterator(); i; i++ )
  77. {
  78. if( i._.name->istGleich( "engine_l" ) )
  79. {
  80. stL = *i._.schwerpunkt;
  81. Vertex l, r;
  82. for( int j = 0; j < 4; j++ )
  83. {
  84. if( i._.tKordinaten->get( j ).y == 1.f )
  85. {
  86. if( i._.tKordinaten->get( j ).x == 0.f )
  87. l = i._.vertex->get( j );
  88. if( i._.tKordinaten->get( j ).x == 1.f )
  89. r = i._.vertex->get( j );
  90. }
  91. }
  92. kL = ( ( l + ( r - l ) * 0.5 ) - stL );
  93. }
  94. if( i._.name->istGleich( "engine_r" ) )
  95. {
  96. stR = *i._.schwerpunkt;
  97. Vertex l, r;
  98. for( int j = 0; j < 4; j++ )
  99. {
  100. if( i._.tKordinaten->get( j ).y == 1.f )
  101. {
  102. if( i._.tKordinaten->get( j ).x == 0.f )
  103. l = i._.vertex->get( j );
  104. if( i._.tKordinaten->get( j ).x == 1.f )
  105. r = i._.vertex->get( j );
  106. }
  107. }
  108. kR = ( ( l + ( r - l ) * 0.5 ) - stR );
  109. }
  110. if( i._.name->istGleich( "engine_m" ) )
  111. {
  112. stM = *i._.schwerpunkt;
  113. Vertex l, r;
  114. for( int j = 0; j < 4; j++ )
  115. {
  116. if( i._.tKordinaten->get( j ).y == 1.f )
  117. {
  118. if( i._.tKordinaten->get( j ).x == 0.f )
  119. l = i._.vertex->get( j );
  120. if( i._.tKordinaten->get( j ).x == 1.f )
  121. r = i._.vertex->get( j );
  122. }
  123. }
  124. kM = ( ( l + ( r - l ) * 0.5 ) - stM );
  125. }
  126. }
  127. kL.normalize();
  128. kR.normalize();
  129. kM.normalize();
  130. setModel( data );
  131. }
  132. void Spieler::setAccountId( int id )
  133. {
  134. accountId = id;
  135. }
  136. void Spieler::setTeam( Team *team )
  137. {
  138. if( this->team )
  139. this->team->release();
  140. this->team = team;
  141. }
  142. void Spieler::setSpielerFarbe( int farbe )
  143. {
  144. this->farbe = farbe;
  145. }
  146. void Spieler::setKlient( Klient *klient )
  147. {
  148. if( this->klient )
  149. this->klient->release();
  150. this->klient = klient;
  151. }
  152. bool Spieler::setTastataturStatus( TastaturStatus ts, bool aktiv )
  153. {
  154. if( tastatur[ ts ] == aktiv || !amLeben )
  155. return 0;
  156. tastatur[ ts ] = aktiv;
  157. return 1;
  158. }
  159. bool Spieler::tick( const WeltInfo& info, double zeit )
  160. {
  161. if( !team )
  162. return 0;
  163. reinkAbk -= zeit;
  164. if( reinkAbk < 0 )
  165. reinkAbk = 0;
  166. if( !reinkAbk && !amLeben )
  167. { // Wiederbelebung
  168. needWiederbelebung = 1;
  169. return 0;
  170. }
  171. if( amLeben )
  172. {
  173. schussAbk -= zeit;
  174. energieAbk -= zeit;
  175. if( schussAbk < 0 )
  176. schussAbk = 0;
  177. if( energieAbk < 0 )
  178. energieAbk = 0;
  179. repAbk -= zeit;
  180. if( repAbk < 0 )
  181. repAbk = 0;
  182. if( tastatur[ T_GAS ] )
  183. {
  184. double treibstoff = 0.5 * ( ( beschleunigung + team->beschleunigung ) / 5 )
  185. * zeit * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
  186. treibstoffVerbraucht += treibstoff;
  187. float factor = 1;
  188. if( treibstoff > energie )
  189. factor = (float)(energie / treibstoff);
  190. impuls( getWorldPos( stM ), getWorldDir( kM ) * (float)zeit * (float)( beschleunigung + team->beschleunigung ) * factor );
  191. energie -= treibstoff * factor;
  192. }
  193. if( tastatur[ T_ROT_R ] )
  194. {
  195. double treibstoff = 0.25 * ( ( wendigkeit + team->wendigkeit ) / 5 )
  196. * zeit * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
  197. treibstoffVerbraucht += treibstoff;
  198. float factor = 1;
  199. if( treibstoff > energie )
  200. factor = (float)( energie / treibstoff );
  201. impuls( getWorldPos( stL ), getWorldDir( kL ) * (float)zeit * (float)( wendigkeit + team->wendigkeit ) * factor );
  202. energie -= treibstoff * factor;
  203. }
  204. if( tastatur[ T_ROT_L ] )
  205. {
  206. double treibstoff = 0.25 * ( ( wendigkeit + team->wendigkeit ) / 5 )
  207. * zeit * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
  208. treibstoffVerbraucht += treibstoff;
  209. float factor = 1;
  210. if( treibstoff > energie )
  211. factor = (float)( energie / treibstoff );
  212. impuls( getWorldPos( stR ), getWorldDir( kR ) * (float)zeit * (float)( wendigkeit + team->wendigkeit ) * factor );
  213. energie -= treibstoff * factor;
  214. }
  215. Model2DObject::tick( info, zeit );
  216. if( !energieAbk )
  217. {
  218. energie += ( akkuLeistung + team->akkuLeistung ) * zeit;
  219. if( energie > ( maxEnergie + team->maxEnergie ) )
  220. energie = ( maxEnergie + team->maxEnergie );
  221. }
  222. if( !repAbk )
  223. {
  224. stability += ( reparatur + team->reparatur ) * zeit;
  225. if( stability > ( maxStability + team->maxStability ) )
  226. stability = ( maxStability + team->maxStability );
  227. }
  228. zeitAmLeben += zeit;
  229. }
  230. else
  231. zeitTod += zeit;
  232. return 0;
  233. }
  234. bool Spieler::setSkill( int art )
  235. {
  236. if( !skillPunkte )
  237. return 0;
  238. skillPunkte--;
  239. switch( art )
  240. {
  241. case 0: // Max Stabilität
  242. maxStability += 10;
  243. stability += 10;
  244. team->maxStability = team->getMaxStabilityBonus();
  245. break;
  246. case 1: // Max Energie
  247. maxEnergie += 10;
  248. team->maxEnergie = team->getMaxEnergieBonus();
  249. break;
  250. case 2: // Reparatur
  251. reparatur += 0.15;
  252. team->reparatur = team->getReperaturBonus();
  253. break;
  254. case 3: // Laser Intensität
  255. laserIntensity += 3;
  256. team->laserIntensity = team->getLaserIntensityBonus();
  257. break;
  258. case 4: // Laser Effizienz
  259. laserEffizienz += 1;
  260. team->laserEffizienz = team->getLaserEffizienzBonus();
  261. break;
  262. case 5: // Laser Tempo
  263. laserTempo += 20;
  264. team->laserTempo = team->getLaserTempoBonus();
  265. break;
  266. case 6: // Beschleunigung
  267. beschleunigung += 1.75;
  268. team->beschleunigung = team->getBeschleunigungBonus();
  269. break;
  270. case 7: // Wendigkeit
  271. wendigkeit += 2.5;
  272. team->wendigkeit = team->getWendigkeitBonus();
  273. break;
  274. case 8: // Netzwerk
  275. netzwerk += 1;
  276. team->maxStability = team->getMaxStabilityBonus();
  277. team->maxEnergie = team->getMaxEnergieBonus();
  278. team->reparatur = team->getReperaturBonus();
  279. team->laserIntensity = team->getLaserIntensityBonus();
  280. team->laserEffizienz = team->getLaserEffizienzBonus();
  281. team->laserTempo = team->getLaserTempoBonus();
  282. team->beschleunigung = team->getBeschleunigungBonus();
  283. team->wendigkeit = team->getWendigkeitBonus();
  284. team->akkuLeistung = team->getAkkuLeistungBonus();
  285. team->antriebEffizienz = team->getAntriebEffizienzBonus();
  286. team->energieSchild = team->getEnergieSchildBonus();
  287. team->energieSchildEffizienz = team->getEnergieSchildEffizienzBonus();
  288. break;
  289. case 9: // Akkuleistung
  290. akkuLeistung += 0.12;
  291. team->akkuLeistung = team->getAkkuLeistungBonus();
  292. break;
  293. case 10: // Akkuleistung
  294. antriebEffizienz += 10;
  295. team->antriebEffizienz = team->getAntriebEffizienzBonus();
  296. break;
  297. case 11: // Energie Schild
  298. energieSchild += 1;
  299. team->energieSchild = team->getEnergieSchildBonus();
  300. break;
  301. case 12: // Energie Schild Effizienz
  302. energieSchildEffizienz += 2;
  303. team->energieSchildEffizienz = team->getEnergieSchildEffizienzBonus();
  304. break;
  305. }
  306. return 1;
  307. }
  308. Laser *Spieler::getLaser( int sId )
  309. {
  310. if( !amLeben || !tastatur[ T_FEUER ] || schussAbk || !team )
  311. return 0;
  312. double kosten = ( ( laserIntensity + team->laserIntensity ) / 2 + ( laserTempo + team->laserTempo ) / 13 ) * ( 1 / ( ( laserEffizienz + team->laserEffizienz ) / 25 ) );
  313. if( kosten < 1 )
  314. kosten = 1;
  315. if( kosten > energie )
  316. return 0;
  317. energie -= kosten;
  318. schussAbk = 1;
  319. energieAbk = 1.5;
  320. shots++;
  321. Vec2< double > sSpeed = ( Vec2<double>( cos( rotation ), sin( rotation ) ) * ( laserTempo + team->laserTempo ) );
  322. sSpeed += speed;
  323. return new Laser( sId, getPosition(), sSpeed, sNum, laserIntensity + team->laserIntensity );
  324. }
  325. bool Spieler::nimmSchaden( double &intensity )
  326. {
  327. double schieldVal = intensity / 100 * energieSchild;
  328. double schieldEVal = schieldVal - schieldVal / 100 * energieSchildEffizienz;
  329. if( schieldEVal > energie )
  330. {
  331. schieldEVal = energie;
  332. schieldVal = schieldEVal / ( 1 - ( energieSchildEffizienz / 100 ) );
  333. }
  334. intensity -= schieldVal;
  335. std::cout << "Schaden: " << intensity << " ";
  336. energie -= schieldEVal;
  337. stability -= intensity;
  338. std::cout << "Stabilität: " << stability << "\n";
  339. schadenBekommen += intensity;
  340. repAbk = 2;
  341. if( stability <= 0 )
  342. {
  343. amLeben = 0;
  344. tode++;
  345. stability = 0;
  346. reinkAbk += maxReinkAbk;
  347. maxReinkAbk++;
  348. punkte--;
  349. }
  350. return stability == 0;
  351. }
  352. void Spieler::machSchaden( double intensity, bool kill )
  353. {
  354. schadenGemacht += intensity;
  355. treffer++;
  356. if( kill )
  357. {
  358. skillPunkte += 2;
  359. kills++;
  360. punkte++;
  361. maxReinkAbk--;
  362. if( maxReinkAbk < 5 )
  363. maxReinkAbk = 5;
  364. }
  365. }
  366. void Spieler::wiederbeleben()
  367. {
  368. setPosition( startPos );
  369. reinkAbk = maxReinkAbk * 2;
  370. energie = maxEnergie + team->maxEnergie;
  371. stability = maxStability + team->maxStability;
  372. schussAbk = 0;
  373. energieAbk = 0;
  374. repAbk = 0;
  375. setSpeed( 0, 0 );
  376. setDrehung( 0 );
  377. setDrehungSpeed( 0 );
  378. for( int i = 0; i < T_MAX; i++ )
  379. tastatur[ i ] = 0;
  380. amLeben = 1;
  381. }
  382. // constant
  383. int Spieler::getAccountId() const
  384. {
  385. return accountId;
  386. }
  387. bool Spieler::istOnline() const
  388. {
  389. return klient ? klient->istOnline() : 0;
  390. }
  391. Klient *Spieler::zKlient() const
  392. {
  393. return klient;
  394. }
  395. bool Spieler::istTreffer( Vec2< float > pos ) const
  396. {
  397. if( !amLeben )
  398. return 0;
  399. return istPunktInnen( pos );
  400. }
  401. // Raumschiff Eigenschaften
  402. double Spieler::getTeamMaxEnergieBonus() const
  403. {
  404. return maxEnergie / 100 * netzwerk;
  405. }
  406. double Spieler::getTeamMaxStabilityBonus() const
  407. {
  408. return maxStability / 100 * netzwerk;
  409. }
  410. double Spieler::getTeamReparaturBonus() const
  411. {
  412. return reparatur / 100 * netzwerk;
  413. }
  414. double Spieler::getTeamLaserIntensityBonus() const
  415. {
  416. return laserIntensity / 100 * netzwerk;
  417. }
  418. double Spieler::getTeamLaserEffizienzBonus() const
  419. {
  420. return laserEffizienz / 100 * netzwerk;
  421. }
  422. double Spieler::getTeamAkkuLeistungBonus() const
  423. {
  424. return akkuLeistung / 100 * netzwerk;
  425. }
  426. double Spieler::getTeamLaserTempoBonus() const
  427. {
  428. return laserTempo / 100 * netzwerk;
  429. }
  430. double Spieler::getTeamBeschleunigungBonus() const
  431. {
  432. return beschleunigung / 100 * netzwerk;
  433. }
  434. double Spieler::getTeamWendigkeitBonus() const
  435. {
  436. return wendigkeit / 100 * netzwerk;
  437. }
  438. double Spieler::getTeamAntriebEffizienzBonus() const
  439. {
  440. return antriebEffizienz / 100 * netzwerk;
  441. }
  442. double Spieler::getTeamEnergieSchildBonus() const
  443. {
  444. return energieSchild / 100 * netzwerk;
  445. }
  446. double Spieler::getTeamEnergieSchildEffizienzBonus() const
  447. {
  448. return energieSchildEffizienz / 100 * netzwerk;
  449. }
  450. bool Spieler::istAmLeben() const
  451. {
  452. return amLeben;
  453. }
  454. // Statistik Werte
  455. int Spieler::getSpielerNummer() const
  456. {
  457. return sNum;
  458. }
  459. Team *Spieler::zTeam() const
  460. {
  461. return team;
  462. }
  463. int Spieler::getSpielerFarbe() const
  464. {
  465. return farbe;
  466. }
  467. int Spieler::getSchadenBekommen() const
  468. {
  469. return (int)schadenBekommen;
  470. }
  471. int Spieler::getSchadenGemacht() const
  472. {
  473. return (int)schadenGemacht;
  474. }
  475. int Spieler::getTreibstoffVerbraucht() const
  476. {
  477. return (int)treibstoffVerbraucht;
  478. }
  479. int Spieler::getShots() const
  480. {
  481. return shots;
  482. }
  483. int Spieler::getTreffer() const
  484. {
  485. return treffer;
  486. }
  487. int Spieler::getPunkte() const
  488. {
  489. return punkte;
  490. }
  491. int Spieler::getKills() const
  492. {
  493. return kills;
  494. }
  495. int Spieler::getTode() const
  496. {
  497. return tode;
  498. }
  499. int Spieler::getZeitAmLeben() const
  500. {
  501. return (int)zeitAmLeben;
  502. }
  503. int Spieler::getZeitTod() const
  504. {
  505. return (int)zeitTod;
  506. }
  507. bool Spieler::doNeedWiederbelebung() const
  508. {
  509. return needWiederbelebung;
  510. }
  511. // Reference Counting
  512. Spieler *Spieler::getThis()
  513. {
  514. ref++;
  515. return this;
  516. }
  517. Spieler *Spieler::release()
  518. {
  519. ref--;
  520. if( !ref )
  521. delete this;
  522. return 0;
  523. }