VideoBestenliste.cpp 13 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, const 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. }