VideoBestenliste.cpp 15 KB

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