SpielLaden.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. #include "SpielLaden.h"
  2. #include "..\..\..\Global\Variablen.h"
  3. #include "..\..\..\Global\Initialisierung.h"
  4. #include "..\..\..\Leser\KartenLeser.h"
  5. #include <DateiSystem.h>
  6. #include <Rahmen.h>
  7. #include <AlphaFeld.h>
  8. #include <Punkt.h>
  9. // Inhalt der SpielLadenListeSpieler Klasse aus SpielLaden.h
  10. // Konstruktor
  11. SpielLadenListeSpieler::SpielLadenListeSpieler( int accountId, Schrift *zSchrift )
  12. {
  13. rahmen = new LRahmen();
  14. rahmen->setSize( 862, 22 );
  15. rahmen->setRamenBreite( 1 );
  16. rahmen->setFarbe( 0xFFFFFFFF );
  17. this->accountId = accountId;
  18. Text *n = infoClient->getSpielerName( accountId );
  19. name = initTextFeld( 1, 1, 149, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, n->getText() );
  20. n->release();
  21. team = initTextFeld( 230, 1, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
  22. ping = initTextFeld( 410, 1, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
  23. fortschritt = new FBalken();
  24. fortschritt->setStyle( FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::L_R | FBalken::Style::FBild | FBalken::Style::Prozent | FBalken::Style::Sichtbar );
  25. fortschritt->setSchriftZ( zSchrift->getThis() );
  26. fortschritt->setSFarbe( 0xFFFFFFFF );
  27. fortschritt->setSSize( 12 );
  28. fortschritt->setPosition( 461, 1 );
  29. fortschritt->setSize( 400, 20 );
  30. fortschritt->reset();
  31. fortschritt->setAktionAnzahl( 100 );
  32. Bild *fbhb = bilder->get( "data/bilder/system.ltdb/fortschrittleh" );
  33. Bild *fbfhb = bilder->get( "data/bilder/system.ltdb/fortschrittvol" );
  34. fortschritt->setHintergrundBildZ( fbhb );
  35. fortschritt->setFBgBildZ( fbfhb );
  36. spielerFarbe = 0;
  37. teamFarbe = 0;
  38. p = 0;
  39. teamName = new Text( "" );
  40. rend = 0;
  41. ref = 1;
  42. }
  43. // Destruktor
  44. SpielLadenListeSpieler::~SpielLadenListeSpieler()
  45. {
  46. rahmen->release();
  47. name->release();
  48. team->release();
  49. ping->release();
  50. fortschritt->release();
  51. teamName->release();
  52. }
  53. // nicht constant
  54. void SpielLadenListeSpieler::setFortschritt( int prozent )
  55. {
  56. fortschritt->aktionPlus( prozent - fortschritt->getAktion() );
  57. rend = 1;
  58. }
  59. void SpielLadenListeSpieler::setPing( int ping )
  60. {
  61. p = ping;
  62. rend = 1;
  63. }
  64. void SpielLadenListeSpieler::setTeamName( Text *zName )
  65. {
  66. teamName->setText( zName->getText() );
  67. rend = 1;
  68. }
  69. void SpielLadenListeSpieler::setSpielerFarbe( int farbe )
  70. {
  71. spielerFarbe = farbe;
  72. rend = 1;
  73. }
  74. void SpielLadenListeSpieler::setTeamFarbe( int farbe )
  75. {
  76. teamFarbe = farbe;
  77. rend = 1;
  78. }
  79. bool SpielLadenListeSpieler::tick( double tickVal )
  80. {
  81. if( !team->zText()->istGleich( teamName->getText() ) )
  82. {
  83. team->setText( teamName->getText() );
  84. rend = 1;
  85. }
  86. if( TextZuInt( ping->zText()->getText(), 10 ) != p )
  87. {
  88. ping->setText( "" );
  89. ping->zText()->append( p );
  90. rend = 1;
  91. }
  92. bool ret = rend;
  93. rend = 0;
  94. return ret;
  95. }
  96. void SpielLadenListeSpieler::render( int y, Bild &zRObj )
  97. {
  98. if( !zRObj.setDrawOptions( 0, y, 862, 22 ) )
  99. return;
  100. rahmen->render( zRObj );
  101. name->render( zRObj );
  102. zRObj.alphaRegion( 170, 1, 40, 20, spielerFarbe );
  103. team->render( zRObj );
  104. zRObj.alphaRegion( 350, 1, 40, 20, teamFarbe );
  105. ping->render( zRObj );
  106. fortschritt->render( zRObj );
  107. zRObj.releaseDrawOptions();
  108. }
  109. // constant
  110. int SpielLadenListeSpieler::getAccountId() const
  111. {
  112. return accountId;
  113. }
  114. // Reference Counting
  115. SpielLadenListeSpieler *SpielLadenListeSpieler::getThis()
  116. {
  117. ref++;
  118. return this;
  119. }
  120. SpielLadenListeSpieler *SpielLadenListeSpieler::release()
  121. {
  122. ref--;
  123. if( !ref )
  124. delete this;
  125. return 0;
  126. }
  127. // Inhalt der SpielLadenListe Klasse aus SpielLaden.h
  128. // Konstruktor
  129. SpielLadenListe::SpielLadenListe( Schrift *zSchrift )
  130. {
  131. bildschirmGröße = BildschirmGröße();
  132. spielerAnzahl = 0;
  133. höhe = 0;
  134. breite = 0;
  135. tickVal = 0;
  136. spielerName = initTextFeld( 1, 1, 149, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Name" );
  137. spielerFarbe = initTextFeld( 150, 1, 90, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Farbe" );
  138. teamName = initTextFeld( 230, 1, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team Name" );
  139. teamFarbe = initTextFeld( 330, 1, 80, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team Farbe" );
  140. ping = initTextFeld( 410, 1, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Ping" );
  141. fortschritt = initTextFeld( 460, 1, 400, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Fortschritt" );
  142. rahmen = new LRahmen();
  143. rahmen->setFarbe( 0xFFFFFFFF );
  144. rahmen->setRamenBreite( 1 );
  145. titel = new AlphaFeld();
  146. titel->setFarbe( 0x1000FF00 );
  147. titel->setStrength( -15 );
  148. spieler = new RCArray < SpielLadenListeSpieler >();
  149. sts = 0;
  150. schrift = zSchrift->getThis();
  151. alpha = 0;
  152. animation = 0;
  153. rend = 0;
  154. ref = 1;
  155. }
  156. // Destruktor
  157. SpielLadenListe::~SpielLadenListe()
  158. {
  159. spielerName->release();
  160. spielerFarbe->release();
  161. teamName->release();
  162. teamFarbe->release();
  163. ping->release();
  164. fortschritt->release();
  165. rahmen->release();
  166. titel->release();
  167. spieler->release();
  168. schrift->release();
  169. if( sts )
  170. sts->release();
  171. }
  172. // nicht constant
  173. void SpielLadenListe::setSTS( SpielerTeamStruktur *sts )
  174. {
  175. if( this->sts )
  176. this->sts->release();
  177. this->sts = sts;
  178. rend = 1;
  179. }
  180. void SpielLadenListe::setSichtbar( bool sichtbar )
  181. {
  182. animation = sichtbar ? 1 : 3;
  183. }
  184. void SpielLadenListe::addSpieler( int accountId, int spielerNummer )
  185. {
  186. SpielLadenListeSpieler *tmp = new SpielLadenListeSpieler( accountId, schrift );
  187. int team = 0;
  188. int max = 0;
  189. int min = 0;
  190. for( int i = 0; i < sts->teamAnzahl; i++ )
  191. {
  192. min = max;
  193. max += sts->teamSize->get( i );
  194. if( spielerNummer >= min && spielerNummer < max )
  195. {
  196. team = i;
  197. break;
  198. }
  199. }
  200. tmp->setSpielerFarbe( sts->spielerFarbe->hat( spielerNummer ) ? sts->spielerFarbe->get( spielerNummer ) : 0 );
  201. tmp->setTeamFarbe( sts->teamFarbe->hat( team ) ? sts->teamFarbe->get( team ) : 0 );
  202. tmp->setTeamName( sts->teamName->z( team ) );
  203. spieler->set( tmp, spielerAnzahl );
  204. spielerAnzahl++;
  205. rend = 1;
  206. }
  207. void SpielLadenListe::setSpielerFortschritt( int accountId, int prozent )
  208. {
  209. for( int i = 0; i < spielerAnzahl; i++ )
  210. {
  211. if( spieler->z( i )->getAccountId() == accountId )
  212. {
  213. spieler->z( i )->setFortschritt( prozent );
  214. break;
  215. }
  216. }
  217. }
  218. void SpielLadenListe::setSpielerPing( int accountId, int ping )
  219. {
  220. for( int i = 0; i < spielerAnzahl; i++ )
  221. {
  222. if( spieler->z( i )->getAccountId() == accountId )
  223. {
  224. spieler->z( i )->setPing( ping );
  225. break;
  226. }
  227. }
  228. }
  229. bool SpielLadenListe::tick( double tickVal )
  230. {
  231. for( int i = 0; i < spielerAnzahl; i++ )
  232. rend |= spieler->z( i )->tick( tickVal );
  233. this->tickVal += tickVal * 500;
  234. int val = ( int )this->tickVal;
  235. if( !val )
  236. {
  237. bool ret = rend;
  238. rend = 0;
  239. return ret;
  240. }
  241. this->tickVal -= val;
  242. if( breite && animation != 4 && höhe != spielerAnzahl * 22 + 23 )
  243. {
  244. höhe += val / 2;
  245. if( höhe > spielerAnzahl * 22 + 23 )
  246. höhe = spielerAnzahl * 22 + 23;
  247. rend = 1;
  248. }
  249. switch( animation )
  250. {
  251. case 1: // größe ++
  252. breite += val;
  253. if( breite >= 864 )
  254. {
  255. breite = 864;
  256. animation = 2;
  257. }
  258. rend = 1;
  259. break;
  260. case 2: // alpha ++
  261. if( alpha + val > 255 )
  262. {
  263. alpha = 255;
  264. animation = 0;
  265. }
  266. else
  267. alpha += val;
  268. rend = 1;
  269. break;
  270. case 3: // alpha --
  271. if( alpha - val < 0 )
  272. {
  273. alpha = 0;
  274. animation = 4;
  275. }
  276. else
  277. alpha -= val;
  278. rend = 1;
  279. break;
  280. case 4: // größe --
  281. breite -= val;
  282. if( breite <= 0 )
  283. {
  284. breite = 0;
  285. höhe = 0;
  286. animation = 0;
  287. }
  288. else if( breite < spielerAnzahl * 22 + 23 )
  289. höhe = breite;
  290. rend = 1;
  291. break;
  292. }
  293. bool ret = rend;
  294. rend = 0;
  295. return ret;
  296. }
  297. void SpielLadenListe::render( Bild &zRObj )
  298. {
  299. if( !breite )
  300. return;
  301. int x = bildschirmGröße.x / 2 - breite / 2;
  302. int y = bildschirmGröße.y / 2 - höhe / 2;
  303. if( !zRObj.setDrawOptions( x, y, breite, höhe ) )
  304. return;
  305. rahmen->setSize( breite, höhe );
  306. rahmen->render( zRObj );
  307. zRObj.setAlpha( alpha );
  308. titel->setPosition( 1, 1 );
  309. titel->setSize( breite - 2, 20 );
  310. titel->render( zRObj );
  311. spielerName->render( zRObj );
  312. spielerFarbe->render( zRObj );
  313. spielerName->render( zRObj );
  314. teamFarbe->render( zRObj );
  315. ping->render( zRObj );
  316. fortschritt->render( zRObj );
  317. zRObj.releaseAlpha();
  318. zRObj.drawLinieH( 1, 21, breite - 2, 0xFFFFFFFF );
  319. if( höhe > 22 )
  320. {
  321. if( !zRObj.setDrawOptions( 1, 22, breite - 2, höhe - 2 ) )
  322. {
  323. zRObj.releaseDrawOptions();
  324. return;
  325. }
  326. zRObj.alphaRegion( 0, 0, breite - 2, höhe - 23, 0x50000000 );
  327. zRObj.setAlpha( alpha );
  328. for( int i = 0; i < spielerAnzahl; i++ )
  329. spieler->z( i )->render( i * 22, zRObj );
  330. zRObj.releaseAlpha();
  331. zRObj.releaseDrawOptions();
  332. }
  333. zRObj.releaseDrawOptions();
  334. }
  335. // constant
  336. int SpielLadenListe::getHeight() const
  337. {
  338. return höhe;
  339. }
  340. int SpielLadenListe::getAlpha() const
  341. {
  342. return (int)alpha;
  343. }
  344. // Reference Counting
  345. SpielLadenListe *SpielLadenListe::getThis()
  346. {
  347. ref++;
  348. return this;
  349. }
  350. SpielLadenListe *SpielLadenListe::release()
  351. {
  352. ref--;
  353. if( !ref )
  354. delete this;
  355. return 0;
  356. }
  357. // Inhalt der SpielLaden Klasse aus SpielLaden.h
  358. // Konstruktor
  359. SpielLaden::SpielLaden( Schrift *zSchrift )
  360. : Thread()
  361. {
  362. karteId = 0;
  363. bildschirmGröße = BildschirmGröße();
  364. hintergrundBild = 0;
  365. ladenAlpha = 0;
  366. hintergrundAlpha = 0;
  367. ladenBild = 0;
  368. tickVal = 0;
  369. geladen = 0;
  370. liste = new SpielLadenListe( zSchrift );
  371. animation = 0;
  372. ende = 0;
  373. rend = 0;
  374. }
  375. // Destruktor
  376. SpielLaden::~SpielLaden()
  377. {
  378. warteAufThread( 1000 );
  379. if( geladen )
  380. hintergrundBild->release();
  381. liste->release();
  382. }
  383. // nicht constant
  384. void SpielLaden::setSpielerTeamStruktur( SpielerTeamStruktur *sts )
  385. {
  386. liste->setSTS( sts );
  387. rend = 1;
  388. }
  389. void SpielLaden::setKarte( int karteId )
  390. {
  391. this->karteId = karteId;
  392. start();
  393. rend = 1;
  394. }
  395. void SpielLaden::setSichtbar( bool sichtbar )
  396. {
  397. animation = sichtbar ? 1 : 4;
  398. }
  399. void SpielLaden::thread()
  400. {
  401. KartenLeser *reader = KartenLeser::getInstance();
  402. reader->lock();
  403. reader->setKarteId( karteId );
  404. hintergrundBild = reader->getLadeBild();
  405. reader->unlock();
  406. reader->release();
  407. if( hintergrundBild )
  408. geladen = 1;
  409. else
  410. run = 0;
  411. }
  412. void SpielLaden::addSpieler( int accountId, int spielerNummer )
  413. {
  414. liste->addSpieler( accountId, spielerNummer );
  415. }
  416. void SpielLaden::setSpielerFortschritt( int accountId, int prozent )
  417. {
  418. liste->setSpielerFortschritt( accountId, prozent );
  419. }
  420. void SpielLaden::setSpielerPing( int accountId, int ping )
  421. {
  422. liste->setSpielerPing( accountId, ping );
  423. }
  424. bool SpielLaden::tick( double tickVal )
  425. {
  426. if( ende )
  427. return 0;
  428. rend |= liste->tick( tickVal );
  429. if( ladenAlpha )
  430. rend = 1;
  431. ladenBild++;
  432. if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
  433. ladenBild = 0;
  434. if( !animation && geladen && ladenAlpha && !ende )
  435. animation = 2;
  436. this->tickVal += tickVal * 150;
  437. int val = ( int )this->tickVal;
  438. if( !val )
  439. {
  440. bool ret = rend;
  441. rend = 0;
  442. return ret;
  443. }
  444. this->tickVal -= val;
  445. switch( animation )
  446. { // ------- Beginne zu laden -------
  447. case 1: // Sichtbar machen der Ladeanimation
  448. if( ladenAlpha + val >= 255 )
  449. {
  450. ladenAlpha = 255;
  451. animation = 0;
  452. if( geladen )
  453. animation = 2;
  454. }
  455. else
  456. ladenAlpha += val;
  457. rend = 1;
  458. break;
  459. case 2: // Sichtbar machen des Hintergrund Bildes
  460. if( hintergrundAlpha + val > 255 )
  461. {
  462. hintergrundAlpha = 255;
  463. animation = 3;
  464. }
  465. else
  466. hintergrundAlpha += val;
  467. rend = 1;
  468. break;
  469. case 3: // Unsichtbar machen der Lade Animation
  470. if( ladenAlpha == 255 )
  471. liste->setSichtbar( 1 ); // während dessen die Liste sichtbar machen
  472. if( ladenAlpha - val < 0 )
  473. {
  474. ladenAlpha = 0;
  475. animation = 0;
  476. }
  477. else
  478. ladenAlpha -= val;
  479. rend = 1;
  480. break;
  481. // ------- Laden beenden -------
  482. case 4: // Ladeanimation sichtbar machen
  483. if( !ladenAlpha && liste->getAlpha() == 255 )
  484. liste->setSichtbar( 0 ); // während dessen die Liste unsichtbar machen
  485. if( ladenAlpha + val > 255 )
  486. {
  487. ladenAlpha = 255;
  488. animation = 5;
  489. }
  490. else
  491. ladenAlpha += val;
  492. rend = 1;
  493. break;
  494. case 5: // Hintergrund Bild mit Lade Animation unsichtbar machen
  495. if( hintergrundAlpha - val < 0 )
  496. {
  497. hintergrundAlpha = 0;
  498. ladenAlpha = 0;
  499. ende = 1;
  500. animation = 0;
  501. spielClient->bereitZumSpiel();
  502. }
  503. else
  504. {
  505. hintergrundAlpha -= val;
  506. ladenAlpha -= val;
  507. }
  508. rend = 1;
  509. break;
  510. }
  511. bool ret = rend;
  512. rend = 0;
  513. return ret;
  514. }
  515. void SpielLaden::render( Bild &zRObj )
  516. {
  517. zRObj.setAlpha( hintergrundAlpha );
  518. if( hintergrundBild )
  519. {
  520. zRObj.drawBild( bildschirmGröße.x / 2 - hintergrundBild->getBreite() / 2, bildschirmGröße.y / 2 - hintergrundBild->getHeight() / 2,
  521. hintergrundBild->getBreite(), hintergrundBild->getHeight(), *hintergrundBild );
  522. }
  523. zRObj.releaseAlpha();
  524. liste->render( zRObj );
  525. zRObj.setAlpha( ladenAlpha );
  526. Bild *zLadenBild = ladeAnimation->zAnimationData()->zBild( ladenBild );
  527. zRObj.drawBild( bildschirmGröße.x / 2 - 25, bildschirmGröße.y / 2 - 25, zLadenBild->getBreite(), zLadenBild->getHeight(), *zLadenBild );
  528. zRObj.releaseAlpha();
  529. }
  530. // constant
  531. int SpielLaden::getAlpha() const
  532. {
  533. return hintergrundAlpha;
  534. }