Bestenliste.cpp 14 KB

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