Bestenliste.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. #include "Bestenliste.h"
  2. #include <Rahmen.h>
  3. #include <Schrift.h>
  4. #include <Punkt.h>
  5. #include <Scroll.h>
  6. #include <TastaturEreignis.h>
  7. #include "../../Initialisierung/Initialisierung.h"
  8. #include "..\Spieler\Spieler.h"
  9. int getStellen( double d );
  10. // Inhalt der BLSpieler Klasse aus Bestenliste.h
  11. // Konstruktor
  12. BLSpieler::BLSpieler( int sNum, Schrift *zS )
  13. {
  14. this->sNum = sNum;
  15. rahmen = new LRahmen();
  16. rahmen->setRamenBreite( 1 );
  17. rahmen->setSize( 420, 20 );
  18. name = initTextFeld( 0, 0, 100, 20, zS, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  19. punkte = initTextFeld( 100, 0, 50, 20, zS, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  20. kills = initTextFeld( 150, 0, 40, 20, zS, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  21. tode = initTextFeld( 190, 0, 40, 20, zS, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  22. schadenGemacht = initTextFeld( 230, 0, 60, 20, zS, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  23. schadenGenommen = initTextFeld( 290, 0, 60, 20, zS, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  24. präzision = initTextFeld( 350, 0, 70, 20, zS, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  25. ref = 1;
  26. }
  27. // Destruktor
  28. BLSpieler::~BLSpieler()
  29. {
  30. rahmen->release();
  31. name->release();
  32. punkte->release();
  33. kills->release();
  34. tode->release();
  35. schadenGemacht->release();
  36. schadenGenommen->release();
  37. präzision->release();
  38. }
  39. // nicht constant
  40. bool BLSpieler::update( Spieler *zSpieler )
  41. {
  42. if( sNum != zSpieler->getSpielerNummer() )
  43. return 0;
  44. rahmen->setFarbe( zSpieler->getSpielerFarbe() );
  45. name->setText( zSpieler->zName()->getText() );
  46. name->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  47. punkte->setText( Text() += zSpieler->getPunkte() );
  48. punkte->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  49. kills->setText( Text() += zSpieler->getKills() );
  50. kills->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  51. tode->setText( Text() += zSpieler->getTode() );
  52. tode->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  53. schadenGemacht->setText( Text() += zSpieler->getSchadenGemacht() );
  54. schadenGemacht->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  55. schadenGenommen->setText( Text() += zSpieler->getSchadenBekommen() );
  56. schadenGenommen->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  57. Text txt;
  58. double d = 100 * ( (double)zSpieler->getTreffer() / zSpieler->getSchüsse() );
  59. if( !zSpieler->getSchüsse() )
  60. d = 0;
  61. txt.setPrecision( getStellen( d ) + 2 );
  62. txt += d;
  63. präzision->setText( txt );
  64. präzision->setSchriftFarbe( zSpieler->getSpielerFarbe() );
  65. return 1;
  66. }
  67. void BLSpieler::render( int y, Bild &zRObj )
  68. {
  69. if( !zRObj.setDrawOptions( 1, y, rahmen->getBreite(), rahmen->getHeight() ) )
  70. return;
  71. rahmen->render( zRObj );
  72. name->render( zRObj );
  73. punkte->render( zRObj );
  74. kills->render( zRObj );
  75. tode->render( zRObj );
  76. schadenGemacht->render( zRObj );
  77. schadenGenommen->render( zRObj );
  78. präzision->render( zRObj );
  79. zRObj.releaseDrawOptions();
  80. }
  81. // constant
  82. int BLSpieler::getSpielerNummer() const
  83. {
  84. return sNum;
  85. }
  86. int BLSpieler::getPunkte() const
  87. {
  88. return *punkte->zText();
  89. }
  90. // Reference Counting
  91. BLSpieler *BLSpieler::getThis()
  92. {
  93. ref++;
  94. return this;
  95. }
  96. BLSpieler *BLSpieler::release()
  97. {
  98. ref--;
  99. if( !ref )
  100. delete this;
  101. return 0;
  102. }
  103. // Inhalt der BLTeam Klasse aus Bestenliste.h
  104. // Konstruktor
  105. BLTeam::BLTeam( int id, Schrift *s )
  106. {
  107. teamId = id;
  108. spielerAnzahl = 0;
  109. schrift = s;
  110. spieler = new RCArray< BLSpieler >();
  111. rahmen = new LRahmen();
  112. rahmen->setRamenBreite( 1 );
  113. name = initTextFeld( 0, 0, 100, 20, s, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  114. punkte = initTextFeld( 100, 0, 50, 20, s, TextFeld::Style::Sichtbar | TextFeld::Style::Center, "" );
  115. ref = 1;
  116. }
  117. // Destruktor
  118. BLTeam::~BLTeam()
  119. {
  120. schrift->release();
  121. rahmen->release();
  122. spieler->release();
  123. name->release();
  124. punkte->release();
  125. }
  126. // nicht constant
  127. bool BLTeam::addSpieler( Spieler *zSpieler )
  128. {
  129. bool gefunden = 0;
  130. for( int i = 0; i < spielerAnzahl; i++ )
  131. {
  132. if( spieler->z( i )->getSpielerNummer() == zSpieler->getSpielerNummer() )
  133. {
  134. gefunden = 1;
  135. break;
  136. }
  137. }
  138. if( gefunden )
  139. return 0;
  140. BLSpieler *tmp = new BLSpieler( zSpieler->getSpielerNummer(), schrift );
  141. tmp->update( zSpieler );
  142. spieler->set( tmp, spielerAnzahl );
  143. spielerAnzahl++;
  144. return 1;
  145. }
  146. bool BLTeam::updateSpieler( Spieler *zSpieler )
  147. {
  148. for( int i = 0; i < spielerAnzahl; i++ )
  149. {
  150. if( spieler->z( i )->getSpielerNummer() == zSpieler->getSpielerNummer() )
  151. {
  152. spieler->z( i )->update( zSpieler );
  153. return 1;
  154. }
  155. }
  156. return 0;
  157. }
  158. void BLTeam::update( Team *zTeam )
  159. {
  160. rahmen->setFarbe( zTeam->farbe );
  161. name->setSchriftFarbe( zTeam->farbe );
  162. name->setText( zTeam->name );
  163. punkte->setSchriftFarbe( zTeam->farbe );
  164. Text pt;
  165. pt += zTeam->punkte;
  166. pt += "/";
  167. pt += zTeam->maxPunkte;
  168. punkte->setText( pt );
  169. }
  170. void BLTeam::render( int y, Bild &zRObj )
  171. {
  172. rahmen->setSize( 422, 21 + 20 * spielerAnzahl );
  173. if( !zRObj.setDrawOptions( 1, y, rahmen->getBreite(), rahmen->getHeight() ) )
  174. return;
  175. rahmen->render( zRObj );
  176. name->render( zRObj );
  177. punkte->render( zRObj );
  178. Array< bool > *gemahlt = new Array< bool >();
  179. for( int i = 0; i < spielerAnzahl; i++ )
  180. gemahlt->set( 0, i );
  181. int min = -1;
  182. int tmp = -1;
  183. for( int h = 0; h < spielerAnzahl; h++ )
  184. {
  185. min = 0x80000000;
  186. tmp = 0x80000000;
  187. for( int i = 0; i < spielerAnzahl; i++ )
  188. {
  189. if( !spieler->z( i ) )
  190. continue;
  191. if( gemahlt->hat( i ) && gemahlt->get( i ) )
  192. continue;
  193. int p = spieler->z( i )->getPunkte();
  194. if( p > min )
  195. {
  196. min = p;
  197. tmp = i;
  198. }
  199. }
  200. if( tmp != 0x80000000 )
  201. {
  202. gemahlt->set( 1, tmp );
  203. spieler->z( tmp )->render( 20 + 20 * h, zRObj );
  204. }
  205. else
  206. break;
  207. }
  208. gemahlt->release();
  209. zRObj.releaseDrawOptions();
  210. }
  211. // constant
  212. int BLTeam::getSpielerAnzahl() const
  213. {
  214. return spielerAnzahl;
  215. }
  216. int BLTeam::getPunkte() const
  217. {
  218. Text *tmp = punkte->zText()->getTeilText( 0, punkte->zText()->positionVon( '/' ) );
  219. int ret = *tmp;
  220. tmp->release();
  221. return ret;
  222. }
  223. int BLTeam::getHeight() const
  224. {
  225. return 21 + spielerAnzahl * 20;
  226. }
  227. // Reference Counting
  228. BLTeam *BLTeam::getThis()
  229. {
  230. ref++;
  231. return this;
  232. }
  233. BLTeam *BLTeam::release()
  234. {
  235. ref--;
  236. if( !ref )
  237. delete this;
  238. return 0;
  239. }
  240. // Inhalt der Bestenliste Klasse aus Bestenliste.h
  241. // Konstruktor
  242. Bestenliste::Bestenliste( Schrift *s )
  243. {
  244. rahmen = new LRahmen();
  245. rahmen->setRamenBreite( 1 );
  246. rahmen->setFarbe( 0xFFFFFFFF );
  247. rahmen->setSize( 440, 200 );
  248. teams = new RCArray< BLTeam >();
  249. name = new TextFeld();
  250. name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  251. name->setSchriftZ( s->getThis() );
  252. name->setSchriftFarbe( 0xFFFFFFFF );
  253. name->setSchriftSize( 12 );
  254. name->setText( "Name" );
  255. name->setSize( 100, 30 );
  256. name->setPosition( 0, 0 );
  257. punkte = new TextFeld();
  258. punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  259. punkte->setSchriftZ( s->getThis() );
  260. punkte->setSchriftFarbe( 0xFFFFFFFF );
  261. punkte->setSchriftSize( 12 );
  262. punkte->setText( "Punkte" );
  263. punkte->setSize( 50, 30 );
  264. punkte->setPosition( 100, 0 );
  265. kills = new TextFeld();
  266. kills->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  267. kills->setSchriftZ( s->getThis() );
  268. kills->setSchriftFarbe( 0xFFFFFFFF );
  269. kills->setSchriftSize( 12 );
  270. kills->setText( "Kills" );
  271. kills->setSize( 40, 30 );
  272. kills->setPosition( 150, 0 );
  273. tode = new TextFeld();
  274. tode->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  275. tode->setSchriftZ( s->getThis() );
  276. tode->setSchriftFarbe( 0xFFFFFFFF );
  277. tode->setSchriftSize( 12 );
  278. tode->setText( "Tode" );
  279. tode->setSize( 40, 30 );
  280. tode->setPosition( 190, 0 );
  281. schadenGemacht = new TextFeld();
  282. schadenGemacht->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Mehrzeilig );
  283. schadenGemacht->setSchriftZ( s->getThis() );
  284. schadenGemacht->setSchriftFarbe( 0xFFFFFFFF );
  285. schadenGemacht->setSchriftSize( 12 );
  286. schadenGemacht->setText( "Schaden\ngemacht" );
  287. schadenGemacht->setSize( 60, 30 );
  288. schadenGemacht->setPosition( 230, 0 );
  289. schadenGenommen = new TextFeld();
  290. schadenGenommen->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Mehrzeilig );
  291. schadenGenommen->setSchriftZ( s->getThis() );
  292. schadenGenommen->setSchriftFarbe( 0xFFFFFFFF );
  293. schadenGenommen->setSchriftSize( 12 );
  294. schadenGenommen->setText( "Schaden\ngenommen" );
  295. schadenGenommen->setSize( 60, 30 );
  296. schadenGenommen->setPosition( 290, 0 );
  297. präzision = new TextFeld();
  298. präzision->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Mehrzeilig );
  299. präzision->setSchriftZ( s->getThis() );
  300. präzision->setSchriftFarbe( 0xFFFFFFFF );
  301. präzision->setSchriftSize( 12 );
  302. präzision->setText( "präzision" );
  303. präzision->setSize( 70, 30 );
  304. präzision->setPosition( 350, 0 );
  305. scroll = new VScrollBar();
  306. scroll->setKlickScroll( 7 );
  307. sichtbar = 0;
  308. schrift = s;
  309. teamAnzahl = 0;
  310. ref = 1;
  311. }
  312. // Destruktor
  313. Bestenliste::~Bestenliste()
  314. {
  315. rahmen->release();
  316. teams->release();
  317. name->release();
  318. punkte->release();
  319. kills->release();
  320. tode->release();
  321. schadenGemacht->release();
  322. schadenGenommen->release();
  323. präzision->release();
  324. scroll->release();
  325. schrift->release();
  326. }
  327. // nicht constant
  328. void Bestenliste::setTeamAnzahl( int anz )
  329. {
  330. teamAnzahl = anz;
  331. }
  332. void Bestenliste::addSpieler( Spieler *zSpieler )
  333. {
  334. int team = zSpieler->zTeam()->id;
  335. if( team < 0 )
  336. return;
  337. if( !teams->z( team ) )
  338. teams->set( new BLTeam( team, schrift->getThis() ), team );
  339. teams->z( team )->addSpieler( zSpieler );
  340. }
  341. void Bestenliste::updateSpieler( Spieler *zSpieler )
  342. {
  343. if( teams->z( zSpieler->zTeam()->id ) )
  344. teams->z( zSpieler->zTeam()->id )->updateSpieler( zSpieler );
  345. }
  346. void Bestenliste::updateTeam( Team *zTeam )
  347. {
  348. if( teams->z( zTeam->id ) )
  349. teams->z( zTeam->id )->update( zTeam );
  350. }
  351. void Bestenliste::doTastaturEreignis( TastaturEreignis &te )
  352. {
  353. if( te.id == TE_Press && te.taste == T_Tab )
  354. sichtbar = !sichtbar;
  355. }
  356. void Bestenliste::doMausEreignis( MausEreignis &me )
  357. {
  358. if( !sichtbar )
  359. return;
  360. scroll->doMausMessage( rahmen->getBreite() - 15, 1, 15, rahmen->getHeight() - 2, me );
  361. }
  362. void Bestenliste::render( Bild &zRObj )
  363. {
  364. if( !sichtbar )
  365. return;
  366. if( !zRObj.setDrawOptions( 0, 0, rahmen->getBreite(), rahmen->getHeight() ) )
  367. return;
  368. rahmen->render( zRObj );
  369. zRObj.alphaRegion( 1, 1, rahmen->getBreite() - 2, rahmen->getHeight() - 2, 0xA0000000 );
  370. zRObj.addScrollOffset( 0, scroll->getScroll() );
  371. name->render( zRObj );
  372. punkte->render( zRObj );
  373. kills->render( zRObj );
  374. tode->render( zRObj );
  375. schadenGemacht->render( zRObj );
  376. schadenGenommen->render( zRObj );
  377. präzision->render( zRObj );
  378. int yOff = 30;
  379. Array< bool > *gemahlt = new Array< bool >();
  380. for( int i = 1; i <= teamAnzahl; i++ )
  381. gemahlt->set( 0, i );
  382. int min = -1;
  383. int tmp = -1;
  384. for( int h = 0; h < teamAnzahl; h++ )
  385. {
  386. min = -1;
  387. tmp = -1;
  388. for( int i = 0; i < teamAnzahl; i++ )
  389. {
  390. if( !teams->z( i + 1 ) )
  391. continue;
  392. if( gemahlt->hat( i + 1 ) && gemahlt->get( i + 1 ) )
  393. continue;
  394. int p = teams->z( i + 1 )->getPunkte();
  395. if( p > min )
  396. {
  397. min = p;
  398. tmp = i + 1;
  399. }
  400. }
  401. if( tmp >= 0 )
  402. {
  403. gemahlt->set( 1, tmp );
  404. teams->z( tmp )->render( yOff, zRObj );
  405. yOff += teams->z( tmp )->getHeight();
  406. }
  407. else
  408. break;
  409. }
  410. gemahlt->release();
  411. zRObj.addScrollOffset( 0, -scroll->getScroll() );
  412. scroll->update( yOff, rahmen->getHeight() - 2 );
  413. scroll->render( rahmen->getBreite() - 16, 1, 15, rahmen->getHeight() - 2, zRObj );
  414. zRObj.releaseDrawOptions();
  415. }
  416. // constant
  417. int Bestenliste::getTeamAnzahl() const
  418. {
  419. return teamAnzahl;
  420. }
  421. bool Bestenliste::teamExistiert( int team ) const
  422. {
  423. return teams->z( team ) != 0;
  424. }
  425. int Bestenliste::getTeamPunkte( int team ) const
  426. {
  427. return teams->z( team ) ? teams->z( team )->getPunkte() : 0;
  428. }
  429. // Reference Counting
  430. Bestenliste *Bestenliste::getThis()
  431. {
  432. ref++;
  433. return this;
  434. }
  435. Bestenliste *Bestenliste::release()
  436. {
  437. ref--;
  438. if( !ref )
  439. delete this;
  440. return 0;
  441. }