Spieler.cpp 15 KB

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