Bestenliste.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. #include "Bestenliste.h"
  2. #include "..\Spieler\Spieler.h"
  3. #include <Rahmen.h>
  4. #include <Schrift.h>
  5. #include <Punkt.h>
  6. #include <Scroll.h>
  7. // Inhalt der BLSpieler Klasse aus Bestenliste.h
  8. // Konstruktor
  9. BLSpieler::BLSpieler( int sNum, int farbe, Schrift *zS )
  10. {
  11. this->sNum = sNum;
  12. this->farbe = farbe;
  13. p = 0;
  14. nP = 0;
  15. rahmen = new LRahmen();
  16. rahmen->setFarbe( farbe );
  17. rahmen->setRamenBreite( 1 );
  18. rahmen->setSize( 400, 20 );
  19. name = new TextFeld();
  20. name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  21. name->setSchriftZ( zS->getThis() );
  22. name->setSchriftFarbe( farbe );
  23. name->setSchriftSize( 12 );
  24. name->setSize( 100, 20 );
  25. name->setPosition( 0, 0 );
  26. name->setText( "" );
  27. punkte = new TextFeld();
  28. punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  29. punkte->setSchriftZ( zS->getThis() );
  30. punkte->setSchriftFarbe( farbe );
  31. punkte->setSchriftSize( 12 );
  32. punkte->setSize( 100, 20 );
  33. punkte->setPosition( 100, 0 );
  34. punkte->setText( "" );
  35. neuPunkte = new TextFeld();
  36. neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  37. neuPunkte->setSchriftZ( zS->getThis() );
  38. neuPunkte->setSchriftFarbe( farbe );
  39. neuPunkte->setSchriftSize( 12 );
  40. neuPunkte->setSize( 100, 20 );
  41. neuPunkte->setPosition( 200, 0 );
  42. neuPunkte->setText( "" );
  43. status = new TextFeld();
  44. status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  45. status->setSchriftZ( zS->getThis() );
  46. status->setSchriftFarbe( 0xFF00FF00 );
  47. status->setSchriftSize( 12 );
  48. status->setSize( 100, 20 );
  49. status->setPosition( 300, 0 );
  50. status->setText( "lebt" );
  51. ref = 1;
  52. }
  53. // Destruktor
  54. BLSpieler::~BLSpieler()
  55. {
  56. rahmen->release();
  57. name->release();
  58. punkte->release();
  59. neuPunkte->release();
  60. status->release();
  61. }
  62. // nicht constant
  63. bool BLSpieler::updateStatus( Spieler *zSpieler )
  64. {
  65. if( sNum != zSpieler->getSpielerNummer() )
  66. return 0;
  67. if( zSpieler->istAmLeben() )
  68. {
  69. status->setSchriftFarbe( 0xFF00FF00 );
  70. status->setText( "lebt" );
  71. }
  72. else
  73. {
  74. status->setSchriftFarbe( 0xFFFF0000 );
  75. status->setText( "tot" );
  76. }
  77. name->setText( zSpieler->zName()->getText() );
  78. return 1;
  79. }
  80. void BLSpieler::setPunkte( int p )
  81. {
  82. this->p = p;
  83. }
  84. void BLSpieler::addPunkt( bool plus )
  85. {
  86. if( plus )
  87. nP++;
  88. else
  89. nP--;
  90. }
  91. void BLSpieler::updatePunkte()
  92. {
  93. p += nP;
  94. nP = 0;
  95. }
  96. void BLSpieler::render( int y, Bild &zRObj )
  97. {
  98. if( !zRObj.setDrawOptions( 1, y, rahmen->getBreite(), rahmen->getHeight() ) )
  99. return;
  100. punkte->setText( "" );
  101. if( nP == 0 )
  102. {
  103. neuPunkte->setText( "" );
  104. neuPunkte->setSchriftFarbe( 0xFFFFFFFF );
  105. }
  106. else if( nP > 0 )
  107. {
  108. neuPunkte->setText( "+" );
  109. neuPunkte->setSchriftFarbe( 0xFF00FF00 );
  110. }
  111. else
  112. {
  113. neuPunkte->setText( "" );
  114. neuPunkte->setSchriftFarbe( 0xFFFF0000 );
  115. }
  116. punkte->zText()->append( p );
  117. neuPunkte->zText()->append( nP );
  118. rahmen->render( zRObj );
  119. name->render( zRObj );
  120. punkte->render( zRObj );
  121. neuPunkte->render( zRObj );
  122. status->render( zRObj );
  123. zRObj.releaseDrawOptions();
  124. }
  125. // constant
  126. int BLSpieler::getSpielerNummer() const
  127. {
  128. return sNum;
  129. }
  130. int BLSpieler::getPunkte() const
  131. {
  132. return p + nP;
  133. }
  134. // Reference Counting
  135. BLSpieler *BLSpieler::getThis()
  136. {
  137. ref++;
  138. return this;
  139. }
  140. BLSpieler *BLSpieler::release()
  141. {
  142. ref--;
  143. if( !ref )
  144. delete this;
  145. return 0;
  146. }
  147. // Inhalt der BLTeam Klasse aus Bestenliste.h
  148. // Konstruktor
  149. BLTeam::BLTeam( int id, int farbe, Schrift *s )
  150. {
  151. teamId = id;
  152. spielerAnzahl = 0;
  153. p = 0;
  154. mP = 0;
  155. nP = 0;
  156. this->farbe = farbe;
  157. schrift = s;
  158. rahmen = new LRahmen();
  159. rahmen->setFarbe( farbe );
  160. rahmen->setRamenBreite( 1 );
  161. spieler = new RCArray< BLSpieler >();
  162. name = new TextFeld();
  163. name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  164. name->setSchriftZ( s->getThis() );
  165. name->setSchriftFarbe( farbe );
  166. name->setSchriftSize( 12 );
  167. name->setSize( 100, 20 );
  168. name->setPosition( 0, 0 );
  169. name->setText( "" );
  170. punkte = new TextFeld();
  171. punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  172. punkte->setSchriftZ( s->getThis() );
  173. punkte->setSchriftFarbe( farbe );
  174. punkte->setSchriftSize( 12 );
  175. punkte->setSize( 100, 20 );
  176. punkte->setPosition( 100, 0 );
  177. punkte->setText( "" );
  178. neuPunkte = new TextFeld();
  179. neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  180. neuPunkte->setSchriftZ( s->getThis() );
  181. neuPunkte->setSchriftFarbe( farbe );
  182. neuPunkte->setSchriftSize( 12 );
  183. neuPunkte->setSize( 100, 20 );
  184. neuPunkte->setPosition( 200, 0 );
  185. neuPunkte->setText( "" );
  186. status = new TextFeld();
  187. status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  188. status->setSchriftZ( s->getThis() );
  189. status->setSchriftFarbe( 0xFF00FF00 );
  190. status->setSchriftSize( 12 );
  191. status->setSize( 100, 20 );
  192. status->setPosition( 300, 0 );
  193. status->setText( "lebt" );
  194. ref = 1;
  195. }
  196. // Destruktor
  197. BLTeam::~BLTeam()
  198. {
  199. schrift->release();
  200. rahmen->release();
  201. spieler->release();
  202. name->release();
  203. punkte->release();
  204. neuPunkte->release();
  205. status->release();
  206. }
  207. // nicht constant
  208. bool BLTeam::addSpieler( Spieler *zSpieler )
  209. {
  210. bool gefunden = 0;
  211. for( int i = 0; i < spielerAnzahl; i++ )
  212. {
  213. if( spieler->z( i )->getSpielerNummer() == zSpieler->getSpielerNummer() )
  214. {
  215. gefunden = 1;
  216. break;
  217. }
  218. }
  219. if( gefunden )
  220. return 0;
  221. BLSpieler *tmp = new BLSpieler( zSpieler->getSpielerNummer(), zSpieler->getFarbe(), schrift );
  222. spieler->set( tmp, spielerAnzahl );
  223. spielerAnzahl++;
  224. return 1;
  225. }
  226. void BLTeam::setName( char *name )
  227. {
  228. this->name->setText( name );
  229. }
  230. bool BLTeam::updateSpielerStatus( Spieler *zSpieler )
  231. {
  232. for( int i = 0; i < spielerAnzahl; i++ )
  233. {
  234. if( spieler->z( i )->getSpielerNummer() == zSpieler->getSpielerNummer() )
  235. {
  236. spieler->z( i )->updateStatus( zSpieler );
  237. return 1;
  238. }
  239. }
  240. return 0;
  241. }
  242. void BLTeam::setStatus( const char *txt, int f )
  243. {
  244. status->setText( txt );
  245. status->setSchriftFarbe( f );
  246. }
  247. void BLTeam::setPunkte( int p )
  248. {
  249. this->p = p;
  250. }
  251. void BLTeam::setMaxPunkte( int mP )
  252. {
  253. this->mP = mP;
  254. }
  255. bool BLTeam::setSpielerPunkte( int sNum, int p )
  256. {
  257. for( int i = 0; i < spielerAnzahl; i++ )
  258. {
  259. if( spieler->z( i )->getSpielerNummer() == sNum )
  260. {
  261. spieler->z( i )->setPunkte( p );
  262. return 1;
  263. }
  264. }
  265. return 0;
  266. }
  267. void BLTeam::addPunkt( bool plus )
  268. {
  269. if( plus )
  270. nP++;
  271. else
  272. nP--;
  273. if( p + nP < 0 )
  274. nP++;
  275. }
  276. bool BLTeam::addPunkt( int sNum, bool plus )
  277. {
  278. for( int i = 0; i < spielerAnzahl; i++ )
  279. {
  280. if( spieler->z( i )->getSpielerNummer() == sNum )
  281. {
  282. spieler->z( i )->addPunkt( plus );
  283. return 1;
  284. }
  285. }
  286. return 0;
  287. }
  288. void BLTeam::updatePunkte()
  289. {
  290. p += nP;
  291. if( p < 0 )
  292. p = 0;
  293. nP = 0;
  294. for( int i = 0; i < spielerAnzahl; i++ )
  295. spieler->z( i )->updatePunkte();
  296. }
  297. void BLTeam::render( int y, Bild &zRObj )
  298. {
  299. rahmen->setSize( 402, 21 + 20 * spielerAnzahl );
  300. if( !zRObj.setDrawOptions( 1, y, rahmen->getBreite(), rahmen->getHeight() ) )
  301. return;
  302. punkte->setText( "" );
  303. if( nP == 0 )
  304. {
  305. neuPunkte->setText( "" );
  306. neuPunkte->setSchriftFarbe( 0xFFFFFFFF );
  307. }
  308. else if( nP > 0 )
  309. {
  310. neuPunkte->setText( "+" );
  311. neuPunkte->setSchriftFarbe( 0xFF00FF00 );
  312. }
  313. else
  314. {
  315. neuPunkte->setText( "" );
  316. neuPunkte->setSchriftFarbe( 0xFFFF0000 );
  317. }
  318. punkte->zText()->append( p );
  319. punkte->zText()->append( "/" );
  320. punkte->zText()->append( mP );
  321. neuPunkte->zText()->append( nP );
  322. rahmen->render( zRObj );
  323. name->render( zRObj );
  324. punkte->render( zRObj );
  325. neuPunkte->render( zRObj );
  326. status->render( zRObj );
  327. Array< bool > *gemahlt = new Array< bool >();
  328. for( int i = 0; i < spielerAnzahl; i++ )
  329. gemahlt->set( 0, i );
  330. int min = -1;
  331. int tmp = -1;
  332. for( int h = 0; h < spielerAnzahl; h++ )
  333. {
  334. min = -1;
  335. tmp = -1;
  336. for( int i = 0; i < spielerAnzahl; i++ )
  337. {
  338. if( !spieler->z( i ) )
  339. continue;
  340. if( gemahlt->hat( i ) && gemahlt->get( i ) )
  341. continue;
  342. int p = spieler->z( i )->getPunkte();
  343. if( p > min )
  344. {
  345. min = p;
  346. tmp = i;
  347. }
  348. }
  349. if( tmp >= 0 )
  350. {
  351. gemahlt->set( 1, tmp );
  352. spieler->z( tmp )->render( 20 + 20 * h, zRObj );
  353. }
  354. else
  355. break;
  356. }
  357. gemahlt->release();
  358. zRObj.releaseDrawOptions();
  359. }
  360. // constant
  361. int BLTeam::getSpielerAnzahl() const
  362. {
  363. return spielerAnzahl;
  364. }
  365. int BLTeam::getPunkte() const
  366. {
  367. return ( p + nP ) < 0 ? 0 : ( p + nP );
  368. }
  369. int BLTeam::getHeight() const
  370. {
  371. return 21 + spielerAnzahl * 20;
  372. }
  373. // Reference Counting
  374. BLTeam *BLTeam::getThis()
  375. {
  376. ref++;
  377. return this;
  378. }
  379. BLTeam *BLTeam::release()
  380. {
  381. ref--;
  382. if( !ref )
  383. delete this;
  384. return 0;
  385. }
  386. // Inhalt der Bestenliste Klasse aus Bestenliste.h
  387. // Konstruktor
  388. Bestenliste::Bestenliste( Schrift *s )
  389. {
  390. rahmen = new LRahmen();
  391. rahmen->setRamenBreite( 1 );
  392. rahmen->setFarbe( 0xFFFFFFFF );
  393. rahmen->setSize( 420, 200 );
  394. teams = new RCArray< BLTeam >();
  395. name = new TextFeld();
  396. name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  397. name->setSchriftZ( s->getThis() );
  398. name->setSchriftFarbe( 0xFFFFFFFF );
  399. name->setSchriftSize( 12 );
  400. name->setText( "Name" );
  401. name->setSize( 100, 20 );
  402. name->setPosition( 0, 0 );
  403. punkte = new TextFeld();
  404. punkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  405. punkte->setSchriftZ( s->getThis() );
  406. punkte->setSchriftFarbe( 0xFFFFFFFF );
  407. punkte->setSchriftSize( 12 );
  408. punkte->setText( "Punkte" );
  409. punkte->setSize( 100, 20 );
  410. punkte->setPosition( 100, 0 );
  411. neuPunkte = new TextFeld();
  412. neuPunkte->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  413. neuPunkte->setSchriftZ( s->getThis() );
  414. neuPunkte->setSchriftFarbe( 0xFFFFFFFF );
  415. neuPunkte->setSchriftSize( 12 );
  416. neuPunkte->setText( "+Punkte" );
  417. neuPunkte->setSize( 100, 20 );
  418. neuPunkte->setPosition( 200, 0 );
  419. status = new TextFeld();
  420. status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
  421. status->setSchriftZ( s->getThis() );
  422. status->setSchriftFarbe( 0xFFFFFFFF );
  423. status->setSchriftSize( 12 );
  424. status->setText( "Status" );
  425. status->setSize( 100, 20 );
  426. status->setPosition( 300, 0 );
  427. scroll = new VScrollBar();
  428. scroll->setKlickScroll( 7 );
  429. schrift = s;
  430. update = 0;
  431. teamAnzahl = 0;
  432. ref = 1;
  433. }
  434. // Destruktor
  435. Bestenliste::~Bestenliste()
  436. {
  437. rahmen->release();
  438. teams->release();
  439. name->release();
  440. punkte->release();
  441. neuPunkte->release();
  442. status->release();
  443. scroll->release();
  444. schrift->release();
  445. }
  446. // nicht constant
  447. void Bestenliste::setTeamAnzahl( int anz )
  448. {
  449. teamAnzahl = anz;
  450. }
  451. void Bestenliste::setTeamStatus( int team, const char *txt, int f )
  452. {
  453. if( teams->z( team ) )
  454. teams->z( team )->setStatus( txt, f );
  455. }
  456. void Bestenliste::addSpieler( Spieler *zSpieler )
  457. {
  458. int team = zSpieler->getTeam();
  459. if( team < 0 )
  460. return;
  461. if( !teams->z( team ) )
  462. teams->set( new BLTeam( team, zSpieler->getTeamFarbe(), schrift->getThis() ), team );
  463. teams->z( team )->addSpieler( zSpieler );
  464. }
  465. void Bestenliste::updateSpielerStatus( Spieler *zSpieler )
  466. {
  467. if( teams->z( zSpieler->getTeam() ) )
  468. teams->z( zSpieler->getTeam() )->updateSpielerStatus( zSpieler );
  469. }
  470. void Bestenliste::setTeamName( int team, char *name )
  471. {
  472. if( teams->z( team ) )
  473. teams->z( team )->setName( name );
  474. }
  475. void Bestenliste::setTeamPunkte( int teamId, int punkte )
  476. {
  477. if( teams->z( teamId ) )
  478. teams->z( teamId )->setPunkte( punkte );
  479. }
  480. void Bestenliste::setTeamMaxPunkte( int teamId, int mPunkte )
  481. {
  482. if( teams->z( teamId ) )
  483. teams->z( teamId )->setMaxPunkte( mPunkte );
  484. }
  485. void Bestenliste::setSpielerPunkte( int teamNum, int sNum, int punkte )
  486. {
  487. if( teams->z( teamNum ) )
  488. teams->z( teamNum )->setSpielerPunkte( sNum, punkte );
  489. }
  490. void Bestenliste::addPunkt( int tNum, bool plus )
  491. {
  492. if( teams->z( tNum ) )
  493. teams->z( tNum )->addPunkt( plus );
  494. }
  495. void Bestenliste::addPunkt( int tNum, int sNum, bool plus )
  496. {
  497. if( teams->z( tNum ) )
  498. teams->z( tNum )->addPunkt( sNum, plus );
  499. }
  500. void Bestenliste::updatePunkte()
  501. {
  502. for( int i = 0; i < teamAnzahl; i++ )
  503. {
  504. if( teams->z( i ) )
  505. teams->z( i )->updatePunkte();
  506. }
  507. }
  508. void Bestenliste::doMausEreignis( MausEreignis &me )
  509. {
  510. scroll->doMausMessage( rahmen->getBreite() - 15, 1, 15, rahmen->getHeight() - 2, me );
  511. }
  512. void Bestenliste::render( Bild &zRObj )
  513. {
  514. if( !zRObj.setDrawOptions( 0, 0, rahmen->getBreite(), rahmen->getHeight() ) )
  515. return;
  516. rahmen->render( zRObj );
  517. zRObj.addScrollOffset( 0, scroll->getScroll() );
  518. name->render( zRObj );
  519. punkte->render( zRObj );
  520. neuPunkte->render( zRObj );
  521. status->render( zRObj );
  522. int yOff = 20;
  523. Array< bool > *gemahlt = new Array< bool >();
  524. for( int i = 0; i < teamAnzahl; i++ )
  525. gemahlt->set( 0, i );
  526. int min = -1;
  527. int tmp = -1;
  528. for( int h = 0; h < teamAnzahl; h++ )
  529. {
  530. min = -1;
  531. tmp = -1;
  532. for( int i = 0; i < teamAnzahl; i++ )
  533. {
  534. if( !teams->z( i ) )
  535. continue;
  536. if( gemahlt->hat( i ) && gemahlt->get( i ) )
  537. continue;
  538. int p = teams->z( i )->getPunkte();
  539. if( p > min )
  540. {
  541. min = p;
  542. tmp = i;
  543. }
  544. }
  545. if( tmp >= 0 )
  546. {
  547. gemahlt->set( 1, tmp );
  548. teams->z( tmp )->render( yOff, zRObj );
  549. yOff += teams->z( tmp )->getHeight();
  550. }
  551. else
  552. break;
  553. }
  554. gemahlt->release();
  555. zRObj.addScrollOffset( 0, -scroll->getScroll() );
  556. scroll->update( yOff, rahmen->getHeight() - 2 );
  557. scroll->render( rahmen->getBreite() - 16, 1, 15, rahmen->getHeight() - 2, zRObj );
  558. zRObj.releaseDrawOptions();
  559. }
  560. // constant
  561. int Bestenliste::getTeamAnzahl() const
  562. {
  563. return teamAnzahl;
  564. }
  565. bool Bestenliste::teamExistiert( int team ) const
  566. {
  567. return teams->z( team ) != 0;
  568. }
  569. int Bestenliste::getTeamPunkte( int team ) const
  570. {
  571. return teams->z( team ) ? teams->z( team )->getPunkte() : 0;
  572. }
  573. // Reference Counting
  574. Bestenliste *Bestenliste::getThis()
  575. {
  576. ref++;
  577. return this;
  578. }
  579. Bestenliste *Bestenliste::release()
  580. {
  581. ref--;
  582. if( !ref )
  583. delete this;
  584. return 0;
  585. }