Spieler.cpp 11 KB

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