SpielLaden.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  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. #include <InitDatei.h>
  10. // Inhalt der SpielLadenListeSpieler Klasse aus SpielLaden.h
  11. // Konstruktor
  12. SpielLadenListeSpieler::SpielLadenListeSpieler( int accountId, Schrift *zSchrift )
  13. {
  14. rahmen = new LRahmen();
  15. rahmen->setSize( 862, 22 );
  16. rahmen->setRamenBreite( 1 );
  17. rahmen->setFarbe( 0xFFFFFFFF );
  18. this->accountId = accountId;
  19. Text *n = infoClient->getSpielerName( accountId );
  20. name = initTextFeld( 1, 1, 149, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, n->getText() );
  21. n->release();
  22. team = initTextFeld( 230, 1, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
  23. ping = initTextFeld( 410, 1, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
  24. fortschritt = new FBalken();
  25. fortschritt->setStyle( FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::L_R | FBalken::Style::FBild | FBalken::Style::Prozent | FBalken::Style::Sichtbar );
  26. fortschritt->setSchriftZ( zSchrift->getThis() );
  27. fortschritt->setSFarbe( 0xFFFFFFFF );
  28. fortschritt->setSSize( 12 );
  29. fortschritt->setPosition( 461, 1 );
  30. fortschritt->setSize( 400, 20 );
  31. fortschritt->reset();
  32. fortschritt->setAktionAnzahl( 100 );
  33. Bild *fbhb = bilder->get( "data/bilder/system.ltdb/fortschrittleh" );
  34. Bild *fbfhb = bilder->get( "data/bilder/system.ltdb/fortschrittvol" );
  35. fortschritt->setHintergrundBildZ( fbhb );
  36. fortschritt->setFBgBildZ( fbfhb );
  37. spielerFarbe = 0;
  38. teamFarbe = 0;
  39. p = 0;
  40. teamName = new Text( "" );
  41. rend = 0;
  42. ref = 1;
  43. }
  44. // Destruktor
  45. SpielLadenListeSpieler::~SpielLadenListeSpieler()
  46. {
  47. rahmen->release();
  48. name->release();
  49. team->release();
  50. ping->release();
  51. fortschritt->release();
  52. teamName->release();
  53. }
  54. // nicht constant
  55. void SpielLadenListeSpieler::setFortschritt( int prozent )
  56. {
  57. fortschritt->aktionPlus( prozent - fortschritt->getAktion() );
  58. rend = 1;
  59. }
  60. void SpielLadenListeSpieler::setPing( int ping )
  61. {
  62. p = ping;
  63. rend = 1;
  64. }
  65. void SpielLadenListeSpieler::setTeamName( Text *zName )
  66. {
  67. teamName->setText( zName->getText() );
  68. rend = 1;
  69. }
  70. void SpielLadenListeSpieler::setSpielerFarbe( int farbe )
  71. {
  72. spielerFarbe = farbe;
  73. rend = 1;
  74. }
  75. void SpielLadenListeSpieler::setTeamFarbe( int farbe )
  76. {
  77. teamFarbe = farbe;
  78. rend = 1;
  79. }
  80. bool SpielLadenListeSpieler::tick( double tickVal )
  81. {
  82. if( !team->zText()->istGleich( teamName->getText() ) )
  83. {
  84. team->setText( teamName->getText() );
  85. rend = 1;
  86. }
  87. if( TextZuInt( ping->zText()->getText(), 10 ) != p )
  88. {
  89. ping->setText( "" );
  90. ping->zText()->append( p );
  91. rend = 1;
  92. }
  93. bool ret = rend;
  94. rend = 0;
  95. return ret;
  96. }
  97. void SpielLadenListeSpieler::render( int y, Bild &zRObj )
  98. {
  99. if( !zRObj.setDrawOptions( 0, y, 862, 22 ) )
  100. return;
  101. rahmen->render( zRObj );
  102. name->render( zRObj );
  103. zRObj.alphaRegion( 170, 1, 40, 20, spielerFarbe );
  104. team->render( zRObj );
  105. zRObj.alphaRegion( 350, 1, 40, 20, teamFarbe );
  106. ping->render( zRObj );
  107. fortschritt->render( zRObj );
  108. zRObj.releaseDrawOptions();
  109. }
  110. // constant
  111. int SpielLadenListeSpieler::getAccountId() const
  112. {
  113. return accountId;
  114. }
  115. // Reference Counting
  116. SpielLadenListeSpieler *SpielLadenListeSpieler::getThis()
  117. {
  118. ref++;
  119. return this;
  120. }
  121. SpielLadenListeSpieler *SpielLadenListeSpieler::release()
  122. {
  123. ref--;
  124. if( !ref )
  125. delete this;
  126. return 0;
  127. }
  128. // Inhalt der SpielLadenListe Klasse aus SpielLaden.h
  129. // Konstruktor
  130. SpielLadenListe::SpielLadenListe( Schrift *zSchrift )
  131. {
  132. bildschirmGröße = hauptScreen->getBackBufferSize();
  133. spielerAnzahl = 0;
  134. höhe = 0;
  135. breite = 0;
  136. tickVal = 0;
  137. spielerName = initTextFeld( 1, 1, 149, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Name" );
  138. spielerFarbe = initTextFeld( 150, 1, 90, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Farbe" );
  139. teamName = initTextFeld( 230, 1, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team Name" );
  140. teamFarbe = initTextFeld( 330, 1, 80, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team Farbe" );
  141. ping = initTextFeld( 410, 1, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Ping" );
  142. fortschritt = initTextFeld( 460, 1, 400, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Fortschritt" );
  143. rahmen = new LRahmen();
  144. rahmen->setFarbe( 0xFFFFFFFF );
  145. rahmen->setRamenBreite( 1 );
  146. titel = new AlphaFeld();
  147. titel->setFarbe( 0x1000FF00 );
  148. titel->setStrength( -15 );
  149. spieler = new RCArray < SpielLadenListeSpieler >();
  150. sts = 0;
  151. schrift = zSchrift->getThis();
  152. alpha = 0;
  153. animation = 0;
  154. rend = 0;
  155. ref = 1;
  156. }
  157. // Destruktor
  158. SpielLadenListe::~SpielLadenListe()
  159. {
  160. spielerName->release();
  161. spielerFarbe->release();
  162. teamName->release();
  163. teamFarbe->release();
  164. ping->release();
  165. fortschritt->release();
  166. rahmen->release();
  167. titel->release();
  168. spieler->release();
  169. schrift->release();
  170. if( sts )
  171. sts->release();
  172. }
  173. // nicht constant
  174. void SpielLadenListe::setSTS( SpielerTeamStruktur *sts )
  175. {
  176. if( this->sts )
  177. this->sts->release();
  178. this->sts = sts;
  179. rend = 1;
  180. }
  181. void SpielLadenListe::setSichtbar( bool sichtbar )
  182. {
  183. animation = sichtbar ? 1 : 3;
  184. }
  185. void SpielLadenListe::addSpieler( int accountId, int spielerNummer )
  186. {
  187. SpielLadenListeSpieler *tmp = new SpielLadenListeSpieler( accountId, schrift );
  188. int team = 0;
  189. int max = 0;
  190. int min = 0;
  191. for( int i = 0; i < sts->teamAnzahl; i++ )
  192. {
  193. min = max;
  194. max += sts->teamSize->get( i );
  195. if( spielerNummer >= min && spielerNummer < max )
  196. {
  197. team = i;
  198. break;
  199. }
  200. }
  201. tmp->setSpielerFarbe( sts->spielerFarbe->hat( spielerNummer ) ? sts->spielerFarbe->get( spielerNummer ) : 0 );
  202. tmp->setTeamFarbe( sts->teamFarbe->hat( team ) ? sts->teamFarbe->get( team ) : 0 );
  203. tmp->setTeamName( sts->teamName->z( team ) );
  204. spieler->set( tmp, spielerAnzahl );
  205. spielerAnzahl++;
  206. rend = 1;
  207. }
  208. void SpielLadenListe::setSpielerFortschritt( int accountId, int prozent )
  209. {
  210. for( int i = 0; i < spielerAnzahl; i++ )
  211. {
  212. if( spieler->z( i )->getAccountId() == accountId )
  213. {
  214. spieler->z( i )->setFortschritt( prozent );
  215. break;
  216. }
  217. }
  218. }
  219. void SpielLadenListe::setSpielerPing( int accountId, int ping )
  220. {
  221. for( int i = 0; i < spielerAnzahl; i++ )
  222. {
  223. if( spieler->z( i )->getAccountId() == accountId )
  224. {
  225. spieler->z( i )->setPing( ping );
  226. break;
  227. }
  228. }
  229. }
  230. bool SpielLadenListe::tick( double tickVal )
  231. {
  232. for( int i = 0; i < spielerAnzahl; i++ )
  233. rend |= spieler->z( i )->tick( tickVal );
  234. this->tickVal += tickVal * 500;
  235. int val = ( int )this->tickVal;
  236. if( !val )
  237. {
  238. bool ret = rend;
  239. rend = 0;
  240. return ret;
  241. }
  242. this->tickVal -= val;
  243. if( breite && animation != 4 && höhe != spielerAnzahl * 22 + 23 )
  244. {
  245. höhe += val / 2;
  246. if( höhe > spielerAnzahl * 22 + 23 )
  247. höhe = spielerAnzahl * 22 + 23;
  248. rend = 1;
  249. }
  250. switch( animation )
  251. {
  252. case 1: // größe ++
  253. breite += val;
  254. if( breite >= 864 )
  255. {
  256. breite = 864;
  257. animation = 2;
  258. }
  259. rend = 1;
  260. break;
  261. case 2: // alpha ++
  262. if( alpha + val > 255 )
  263. {
  264. alpha = 255;
  265. animation = 0;
  266. }
  267. else
  268. alpha += val;
  269. rend = 1;
  270. break;
  271. case 3: // alpha --
  272. if( alpha - val < 0 )
  273. {
  274. alpha = 0;
  275. animation = 4;
  276. }
  277. else
  278. alpha -= val;
  279. rend = 1;
  280. break;
  281. case 4: // größe --
  282. breite -= val;
  283. if( breite <= 0 )
  284. {
  285. breite = 0;
  286. höhe = 0;
  287. animation = 0;
  288. }
  289. else if( breite < spielerAnzahl * 22 + 23 )
  290. höhe = breite;
  291. rend = 1;
  292. break;
  293. }
  294. bool ret = rend;
  295. rend = 0;
  296. return ret;
  297. }
  298. void SpielLadenListe::render( Bild &zRObj )
  299. {
  300. if( !breite )
  301. return;
  302. int x = bildschirmGröße.x / 2 - breite / 2;
  303. int y = bildschirmGröße.y / 2 - höhe / 2;
  304. if( !zRObj.setDrawOptions( x, y, breite, höhe ) )
  305. return;
  306. rahmen->setSize( breite, höhe );
  307. rahmen->render( zRObj );
  308. zRObj.setAlpha( alpha );
  309. titel->setPosition( 1, 1 );
  310. titel->setSize( breite - 2, 20 );
  311. titel->render( zRObj );
  312. spielerName->render( zRObj );
  313. spielerFarbe->render( zRObj );
  314. spielerName->render( zRObj );
  315. teamFarbe->render( zRObj );
  316. ping->render( zRObj );
  317. fortschritt->render( zRObj );
  318. zRObj.releaseAlpha();
  319. zRObj.drawLinieH( 1, 21, breite - 2, 0xFFFFFFFF );
  320. if( höhe > 22 )
  321. {
  322. if( !zRObj.setDrawOptions( 1, 22, breite - 2, höhe - 2 ) )
  323. {
  324. zRObj.releaseDrawOptions();
  325. return;
  326. }
  327. zRObj.alphaRegion( 0, 0, breite - 2, höhe - 23, 0x50000000 );
  328. zRObj.setAlpha( alpha );
  329. for( int i = 0; i < spielerAnzahl; i++ )
  330. spieler->z( i )->render( i * 22, zRObj );
  331. zRObj.releaseAlpha();
  332. zRObj.releaseDrawOptions();
  333. }
  334. zRObj.releaseDrawOptions();
  335. }
  336. // constant
  337. int SpielLadenListe::getHeight() const
  338. {
  339. return höhe;
  340. }
  341. int SpielLadenListe::getAlpha() const
  342. {
  343. return (int)alpha;
  344. }
  345. // Reference Counting
  346. SpielLadenListe *SpielLadenListe::getThis()
  347. {
  348. ref++;
  349. return this;
  350. }
  351. SpielLadenListe *SpielLadenListe::release()
  352. {
  353. ref--;
  354. if( !ref )
  355. delete this;
  356. return 0;
  357. }
  358. // Inhalt der SpielLaden Klasse aus SpielLaden.h
  359. // Konstruktor
  360. SpielLaden::SpielLaden( Schrift *zSchrift )
  361. : Thread()
  362. {
  363. karteId = 0;
  364. bildschirmGröße = hauptScreen->getBackBufferSize();
  365. hintergrundBild = 0;
  366. ladenAlpha = 0;
  367. hintergrundAlpha = 0;
  368. ladenBild = 0;
  369. tickVal = 0;
  370. geladen = 0;
  371. liste = new SpielLadenListe( zSchrift );
  372. animation = 0;
  373. ende = 0;
  374. rend = 0;
  375. }
  376. // Destruktor
  377. SpielLaden::~SpielLaden()
  378. {
  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. }
  535. // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
  536. Thread *SpielLaden::release()
  537. {
  538. if( ref == 2 && run )
  539. warteAufThread( 1000 );
  540. return Thread::release();
  541. }