KarteAuswahl.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. #include "KarteAuswahl.h"
  2. #include <Text.h>
  3. #include <Rahmen.h>
  4. #include <Punkt.h>
  5. #include <Schrift.h>
  6. #include <AlphaFeld.h>
  7. #include <TextFeld.h>
  8. #include <Datei.h>
  9. #include <DateiSystem.h>
  10. #include "..\..\..\Global\Initialisierung.h"
  11. #include <MausEreignis.h>
  12. #include "..\..\..\Global\Variablen.h"
  13. #include "..\..\..\Leser\KartenLeser.h"
  14. #include <Globals.h>
  15. void KarteAuswahlKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
  16. {
  17. if( !p )
  18. return;
  19. ( (KarteDaten*)p )->ksgsAktion( parameter, retVal );
  20. }
  21. KarteDaten::Loader::Loader( KarteDaten *kd, int aktion )
  22. {
  23. this->aktion = aktion;
  24. this->kd = kd;
  25. ref = 2;
  26. start();
  27. }
  28. void KarteDaten::Loader::thread()
  29. {
  30. if( !aktion )
  31. {
  32. kd->geladen = 0;
  33. if( kd->hintergrund )
  34. kd->hintergrund = kd->hintergrund->release();
  35. if( kd->beschreibung )
  36. {
  37. kd->beschreibung->zurücksetzen();
  38. kd->beschreibung = dynamic_cast<KSGScriptObj*>(kd->beschreibung->release());
  39. }
  40. kd->rend = 1;
  41. if( kd->ksgs )
  42. {
  43. Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
  44. kd->ksgs = 0;
  45. }
  46. }
  47. else
  48. {
  49. KartenLeser *mapReader = KartenLeser::getInstance();
  50. mapReader->lock();
  51. mapReader->setKarteId( kd->karteId );
  52. if( aktion == 1 )
  53. {
  54. if( !kd->hintergrund )
  55. kd->hintergrund = mapReader->getKartenTitelBild( kd->schrift );
  56. if( !kd->geladen )
  57. kd->geladen = 1;
  58. kd->rend = 1;
  59. }
  60. if( aktion == 2 )
  61. {
  62. if( !mapReader->getKartenBeschreibung() )
  63. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Beschreibung nicht gefunden." ), new Text( "Ok" ) );
  64. if( kd->beschreibung )
  65. {
  66. kd->beschreibung->zurücksetzen();
  67. kd->beschreibung = dynamic_cast<KSGScriptObj*>(kd->beschreibung->release());
  68. }
  69. if( !kd->ksgs )
  70. kd->ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
  71. if( kd->ksgs )
  72. {
  73. KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( kd->ksgs, KSGS_START_FUNKTION );
  74. if( getKSGScript )
  75. {
  76. kd->beschreibung = getKSGScript();
  77. kd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
  78. kd->beschreibung->setSchriftZ( kd->schrift->getThis() );
  79. kd->beschreibung->setSize( 578, 428 );
  80. kd->beschreibung->setRückrufParam( kd );
  81. kd->beschreibung->setRückrufFunktion( KarteAuswahlKSGSAktion );
  82. Text *pf = mapReader->getKartePfad();
  83. *pf += "beschreibung.ksgs";
  84. kd->beschreibung->setScriptDatei( pf );
  85. }
  86. else
  87. {
  88. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  89. new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
  90. "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
  91. new Text( "Ok" ), 0 );
  92. }
  93. }
  94. else
  95. {
  96. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  97. new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
  98. new Text( "Ok" ), 0 );
  99. }
  100. if( kd->beschreibung )
  101. {
  102. kd->geladen = 2;
  103. if( kd->ausgewählt )
  104. {
  105. kd->beschreibung->lock();
  106. kd->animation |= 0x4;
  107. kd->beschreibung->neuLaden();
  108. KSGSGetVariable getKSGSVar = (KSGSGetVariable)GetProcAddress( kd->ksgs, KSGS_VARIABLE_FUNKTION );
  109. RCArray< KSGSVariable > *params = new RCArray< KSGSVariable >();
  110. KSGSVariableDef p1;
  111. p1.typId = KSGS_BOOL;
  112. p1.wert = (int)kd->erlaubt;
  113. params->add( getKSGSVar( kd->beschreibung, &p1 ) );
  114. KSGSVariable *var = kd->beschreibung->startFunktion( kd->beschreibung->getFunktionId( "_set_Erlaubt" ), params );
  115. if( var )
  116. var->release();
  117. kd->beschreibung->unlock();
  118. }
  119. }
  120. kd->rend = 1;
  121. }
  122. mapReader->unlock();
  123. mapReader->release();
  124. }
  125. if( !kd->erlaubt )
  126. kd->updateErlaubt();
  127. kd->rend = 1;
  128. release();
  129. }
  130. KarteDaten::Loader *KarteDaten::Loader::release()
  131. {
  132. if( !--ref )
  133. delete this;
  134. return 0;
  135. };
  136. int KarteDaten::Loader::getAction() const
  137. {
  138. return aktion;
  139. }
  140. // Inhalt der KarteDaten Klasse aus KarteAuswahl.h
  141. // Konstruktor
  142. KarteDaten::KarteDaten( Schrift *zSchrift, int id )
  143. {
  144. hintergrund = 0;
  145. beschreibung = 0;
  146. ksgs = 0;
  147. rahmen = new LRahmen();
  148. rahmen->setFarbe( 0xFFFFFFFF );
  149. rahmen->setRamenBreite( 1 );
  150. tickVal = 0;
  151. animation = 0;
  152. ausgewählt = 0;
  153. pos = Punkt( 0, 500 );
  154. gr = Punkt( 200, 100 );
  155. schrift = zSchrift->getThis();
  156. karteId = id;
  157. geladen = 0;
  158. auswahl = new AlphaFeld();
  159. auswahl->setFarbe( 0x0000FF00 );
  160. auswahl->setStrength( 8 );
  161. auswahl->setSize( 200, 100 );
  162. auswAlpha = 0;
  163. rend = 0;
  164. erlaubt = 0;
  165. tAlpha = 0;
  166. alpha = 0;
  167. ref = 1;
  168. loader = new Loader( this, 1 );
  169. }
  170. // Destruktor
  171. KarteDaten::~KarteDaten()
  172. {
  173. if( loader && loader->isRunning() )
  174. loader->warteAufThread( INT_MAX );
  175. loader->release();
  176. if( schrift )
  177. schrift->release();
  178. if( hintergrund )
  179. hintergrund->release();
  180. if( beschreibung )
  181. {
  182. beschreibung->zurücksetzen();
  183. beschreibung->release();
  184. }
  185. if( ksgs )
  186. {
  187. Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
  188. ksgs = 0;
  189. }
  190. rahmen->release();
  191. auswahl->release();
  192. }
  193. // nicht constant
  194. void KarteDaten::updateErlaubt()
  195. {
  196. if( geladen != 2 )
  197. return;
  198. bool update = erlaubt;
  199. erlaubt = infoClient->istKarteErlaubt( karteId );
  200. if( update != erlaubt && beschreibung && ksgs )
  201. {
  202. beschreibung->lock();
  203. KSGSGetVariable getKSGSVar = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
  204. RCArray< KSGSVariable > *params = new RCArray< KSGSVariable >();
  205. KSGSVariableDef p1;
  206. p1.typId = KSGS_BOOL;
  207. p1.wert = (int)erlaubt;
  208. params->add( getKSGSVar( beschreibung, &p1 ) );
  209. KSGSVariable *var = beschreibung->startFunktion( beschreibung->getFunktionId( "_set_Erlaubt" ), params );
  210. if( var )
  211. var->release();
  212. beschreibung->unlock();
  213. }
  214. }
  215. void KarteDaten::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
  216. {
  217. if( parameter && parameter->getEintragAnzahl() > 0 )
  218. {
  219. Text *txt = parameter->z( 0 )->getText();
  220. if( erlaubt && txt->istGleich( "anmelden" ) )
  221. {
  222. if( nachLogin && nachLogin->zSpielenFenster() )
  223. nachLogin->zSpielenFenster()->anmelden( karteId );
  224. }
  225. if( erlaubt && txt->istGleich( "gruppeErstellen" ) )
  226. {
  227. if( !anmeldungClient )
  228. anmeldungClient = mainClient->createAnmeldungServerClient();
  229. if( !anmeldungClient )
  230. {
  231. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( mainClient->getLetzterFehler() ),
  232. new Text( "Ok" ), 0 );
  233. rend = 1;
  234. }
  235. if( !anmeldungClient->verbinde() )
  236. {
  237. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( anmeldungClient->getLetzterFehler() ),
  238. new Text( "Ok" ), 0 );
  239. rend = 1;
  240. }
  241. else
  242. {
  243. int ret = anmeldungClient->gruppeErstellen( karteId );
  244. if( !ret && nachLogin )
  245. {
  246. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( anmeldungClient->getLetzterFehler() ),
  247. new Text( "Ok" ), 0 );
  248. }
  249. else if( nachLogin )
  250. nachLogin->zSpielenFenster()->gruppeBetreten( ret );
  251. anmeldungClient->trenne( 0 );
  252. }
  253. }
  254. txt->release();
  255. }
  256. }
  257. void KarteDaten::setSichtbar( bool sichtbar )
  258. {
  259. if( sichtbar )
  260. animation |= 0x1;
  261. else
  262. {
  263. animation &= ~0x1;
  264. setAuswahl( 0 );
  265. }
  266. if( sichtbar && geladen != 2 && loader->getAction() != 2 )
  267. {
  268. Loader *altLoader = loader;
  269. loader = new Loader( this, 2 );
  270. altLoader->release();
  271. }
  272. rend = 1;
  273. }
  274. void KarteDaten::setSichtbar()
  275. {
  276. animation |= 0x1;
  277. if( ausgewählt && geladen == 2 )
  278. {
  279. animation |= 0x4;
  280. beschreibung->setPosition( beschreibung->getX(), 0 );
  281. }
  282. if( geladen != 2 && loader->getAction() != 2 )
  283. {
  284. Loader *altLoader = loader;
  285. loader = new Loader( this, 2 );
  286. altLoader->release();
  287. }
  288. rend = 1;
  289. }
  290. void KarteDaten::setAuswahl( bool auswahl )
  291. {
  292. if( ausgewählt == auswahl )
  293. return;
  294. ausgewählt = auswahl;
  295. if( auswahl )
  296. {
  297. animation |= 0x4;
  298. if( beschreibung && ksgs )
  299. {
  300. beschreibung->lock();
  301. beschreibung->neuLaden();
  302. KSGSGetVariable getKSGSVar = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
  303. RCArray< KSGSVariable > *params = new RCArray< KSGSVariable >();
  304. KSGSVariableDef p1;
  305. p1.typId = KSGS_BOOL;
  306. p1.wert = (int)erlaubt;
  307. params->add( getKSGSVar( beschreibung, &p1 ) );
  308. KSGSVariable *var = beschreibung->startFunktion( beschreibung->getFunktionId( "_set_Erlaubt" ), params );
  309. if( var )
  310. var->release();
  311. beschreibung->unlock();
  312. }
  313. }
  314. else
  315. animation &= ~0x4;
  316. rend = 1;
  317. }
  318. void KarteDaten::setPosition( int lPos )
  319. {
  320. pos.y = lPos * 100;
  321. rend = 1;
  322. }
  323. bool KarteDaten::tick( double tickVal )
  324. {
  325. if( beschreibung )
  326. {
  327. beschreibung->lock();
  328. rend |= beschreibung->tick( tickVal );
  329. beschreibung->unlock();
  330. }
  331. this->tickVal += tickVal * 500;
  332. int val = ( int ) this->tickVal;
  333. if( val < 1 )
  334. {
  335. bool ret = rend;
  336. rend = 0;
  337. return ret;
  338. }
  339. if( val > 17 )
  340. val = 17;
  341. this->tickVal -= val;
  342. if( ausgewählt )
  343. {
  344. if( auswAlpha != 0xF0 )
  345. {
  346. auswAlpha += val;
  347. if( auswAlpha > 0xF0 )
  348. auswAlpha = 0xF0;
  349. rend = 1;
  350. }
  351. }
  352. else
  353. {
  354. if( auswAlpha != 0 )
  355. {
  356. auswAlpha -= val;
  357. if( auswAlpha > 0xF0 )
  358. auswAlpha = 0;
  359. rend = 1;
  360. }
  361. }
  362. if( ( animation | 0x1 ) == animation ) // sichtbar
  363. {
  364. if( tAlpha != 255 )
  365. {
  366. if( tAlpha + val > 255 )
  367. tAlpha = 255;
  368. else
  369. tAlpha += val;
  370. rend = 1;
  371. }
  372. }
  373. else // unsichtbar
  374. {
  375. if( tAlpha != 0 )
  376. {
  377. if( tAlpha - val < 0 )
  378. tAlpha = 0;
  379. else
  380. tAlpha -= val;
  381. rend = 1;
  382. }
  383. }
  384. if( ( animation | 0x4 ) == animation ) // auswählen
  385. {
  386. if( beschreibung )
  387. {
  388. if( alpha != 255 )
  389. {
  390. if( alpha + val < 255 )
  391. alpha += val;
  392. else
  393. alpha = 255;
  394. rend = 1;
  395. }
  396. }
  397. }
  398. else // abwählen
  399. {
  400. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  401. if( a != 0 )
  402. {
  403. a -= val;
  404. if( a < 0 )
  405. a = 0;
  406. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  407. rend = 1;
  408. }
  409. if( beschreibung )
  410. {
  411. if( alpha != 0 )
  412. {
  413. if( alpha - val > 0 )
  414. alpha -= val;
  415. else
  416. alpha = 0;
  417. rend = 1;
  418. }
  419. }
  420. }
  421. bool ret = rend;
  422. rend = 0;
  423. return ret;
  424. }
  425. void KarteDaten::doPublicMausEreignis( MausEreignis &me )
  426. {
  427. me.mx -= gr.x;
  428. if( beschreibung )
  429. beschreibung->doPublicMausEreignis( me );
  430. me.mx += gr.x;
  431. }
  432. void KarteDaten::render( Bild &zRObj )
  433. {
  434. int x = pos.x;
  435. int y = pos.y;
  436. int br = gr.x;
  437. int hö = gr.y;
  438. if( !zRObj.setDrawOptions( x, y, br, hö ) )
  439. return;
  440. zRObj.setAlpha( tAlpha );
  441. rahmen->setSize( br, hö );
  442. rahmen->render( zRObj );
  443. int rbr = rahmen->getRBreite();
  444. if( geladen && hintergrund )
  445. zRObj.drawBild( rbr, rbr, br - rbr * 2, hö - rbr * 2, *hintergrund );
  446. if( auswAlpha && auswahl )
  447. {
  448. auswahl->setFarbe( ( auswahl->getFarbe() & 0x00FFFFFF ) | ( auswAlpha << 24 ) );
  449. auswahl->setPosition( rbr, rbr );
  450. auswahl->setSize( br - rbr * 2, hö - rbr * 2 );
  451. auswahl->render( zRObj );
  452. }
  453. zRObj.releaseDrawOptions();
  454. x = br;
  455. y = 0;
  456. br = 580;
  457. hö = 480;
  458. if( !zRObj.setDrawOptions( x, y, br, hö ) )
  459. {
  460. zRObj.releaseAlpha();
  461. return;
  462. }
  463. if( geladen == 2 )
  464. {
  465. zRObj.setAlpha( alpha );
  466. if( beschreibung )
  467. beschreibung->render( zRObj );
  468. zRObj.releaseAlpha();
  469. }
  470. zRObj.releaseDrawOptions();
  471. zRObj.releaseAlpha();
  472. }
  473. // constant
  474. int KarteDaten::getKarteId() const
  475. {
  476. return karteId;
  477. }
  478. bool KarteDaten::istausgewählt() const
  479. {
  480. return ausgewählt;
  481. }
  482. // Reference Counting
  483. KarteDaten *KarteDaten::getThis()
  484. {
  485. ref++;
  486. return this;
  487. }
  488. KarteDaten *KarteDaten::release()
  489. {
  490. ref--;
  491. if( !ref )
  492. delete this;
  493. return 0;
  494. }
  495. // Inhalt der KarteAuswahlFenster Klasse aus KarteAuswahl.h
  496. // Konstruktor
  497. KarteAuswahlFenster::KarteAuswahlFenster( Schrift *zSchrift )
  498. {
  499. schrift = zSchrift->getThis();
  500. tr = new TextRenderer( schrift->getThis() );
  501. rahmen = new LRahmen();
  502. rahmen->setFarbe( 0xFFFFFFFF );
  503. rahmen->setRamenBreite( 1 );
  504. rahmen->setSize( 760, 500 );
  505. members = new RCArray< KarteDaten >();
  506. anzahl = 0;
  507. animation = 0;
  508. auswahl = -1;
  509. tickVal = 0;
  510. seite = 0;
  511. pos = Punkt( 10, 10 );
  512. gr = Punkt( 780, 430 );
  513. spielId = 0;
  514. rend = 0;
  515. alpha = 0;
  516. }
  517. // Destruktor
  518. KarteAuswahlFenster::~KarteAuswahlFenster()
  519. {
  520. if( schrift )
  521. schrift->release();
  522. if( rahmen )
  523. rahmen->release();
  524. if( members )
  525. members->release();
  526. tr->release();
  527. }
  528. // nicht constant
  529. void KarteAuswahlFenster::setSpielId( int id )
  530. {
  531. spielId = id;
  532. members->leeren();
  533. anzahl = 0;
  534. start();
  535. }
  536. void KarteAuswahlFenster::setSichtbar( bool sichtbar )
  537. {
  538. if( sichtbar )
  539. {
  540. animation |= 0x1;
  541. start();
  542. }
  543. else
  544. {
  545. auswahl = -1;
  546. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  547. members->z( i )->setSichtbar( 0 );
  548. animation &= ~0x1;
  549. }
  550. rend = 1;
  551. }
  552. void KarteAuswahlFenster::blättern( bool oben )
  553. {
  554. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  555. members->z( i )->setSichtbar( 0 );
  556. seite += oben ? 1 : -1;
  557. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  558. {
  559. members->z( i )->setPosition( i % 4 );
  560. members->z( i )->setSichtbar( 1 );
  561. }
  562. auswahl = -1;
  563. rend = 1;
  564. }
  565. void KarteAuswahlFenster::updateListe()
  566. {
  567. if( run )
  568. return;
  569. start();
  570. }
  571. void KarteAuswahlFenster::thread()
  572. {
  573. Array< int > *liste = infoClient->getAccountKarteListe( spielId );
  574. if( !liste )
  575. {
  576. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( infoClient->getLetzterFehler() ),
  577. new Text( "Ok" ), 0 );
  578. run = 0;
  579. return;
  580. }
  581. int anz = liste->getEintragAnzahl();
  582. for( int i = 0; i < anz; i++ )
  583. {
  584. bool gefunden = 0;
  585. for( int j = 0; j < anzahl; j++ )
  586. {
  587. KarteDaten *tmp = members->z( j );
  588. if( liste->hat( i ) && tmp->getKarteId() == liste->get( i ) )
  589. {
  590. gefunden = 1;
  591. break;
  592. }
  593. }
  594. if( !gefunden )
  595. {
  596. KarteDaten *tmp = new KarteDaten( schrift, liste->hat( i ) ? liste->get( i ) : 0 );
  597. members->add( tmp, anzahl );
  598. anzahl++;
  599. }
  600. }
  601. if( liste )
  602. liste->release();
  603. for( int i = 0; i < anzahl; i++ )
  604. members->z( i )->updateErlaubt();
  605. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  606. {
  607. members->z( i )->setPosition( i % 4 );
  608. members->z( i )->setSichtbar();
  609. }
  610. rend = 1;
  611. run = 0;
  612. }
  613. bool KarteAuswahlFenster::tick( double tickVal )
  614. {
  615. for( int i = 0; i < anzahl; i++ )
  616. rend |= members->z( i )->tick( tickVal );
  617. this->tickVal += tickVal * 750;
  618. int val = ( int )this->tickVal;
  619. if( val < 1 )
  620. {
  621. bool ret = rend;
  622. rend = 0;
  623. return ret;
  624. }
  625. if( val > 25 )
  626. val = 25;
  627. this->tickVal -= val;
  628. if( ( animation | 0x1 ) == animation ) // sichtbar
  629. {
  630. if( alpha < 255 )
  631. {
  632. if( alpha + val >= 255 )
  633. {
  634. alpha = 255;
  635. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  636. {
  637. members->z( i )->setPosition( i % 4 );
  638. members->z( i )->setSichtbar( 1 );
  639. }
  640. }
  641. else
  642. alpha += val;
  643. rend = 1;
  644. }
  645. }
  646. else // unsichtbar
  647. {
  648. if( alpha > 0 )
  649. {
  650. if( alpha - val < 0 )
  651. alpha = 0;
  652. else
  653. alpha -= val;
  654. rend = 1;
  655. }
  656. }
  657. bool ret = rend;
  658. rend = 0;
  659. return ret;
  660. }
  661. void KarteAuswahlFenster::doPublicMausEreignis( MausEreignis &me )
  662. {
  663. if( !members )
  664. return;
  665. if( pos.x != 10 )
  666. return;
  667. me.mx -= pos.x;
  668. me.my -= pos.y;
  669. for( int i = 0; i < anzahl; i++ )
  670. members->z( i )->doPublicMausEreignis( me );
  671. if( me.mx < 0 || me.my < 0 )
  672. {
  673. me.mx += pos.x;
  674. me.my += pos.y;
  675. return;
  676. }
  677. if( me.mx > 200 || me.my > getAnzahlAufSeite() * 100 )
  678. {
  679. me.mx += pos.x;
  680. me.my += pos.y;
  681. return;
  682. }
  683. if( me.id == ME_RLinks )
  684. {
  685. int treffer = me.my / 100 + seite * 4;
  686. if( treffer >= anzahl )
  687. {
  688. me.mx += pos.x;
  689. me.my += pos.y;
  690. return;
  691. }
  692. if( treffer == auswahl )
  693. {
  694. me.mx += pos.x;
  695. me.my += pos.y;
  696. return;
  697. }
  698. if( auswahl >= 0 )
  699. members->z( auswahl )->setAuswahl( 0 );
  700. members->z( treffer )->setAuswahl( 1 );
  701. auswahl = treffer;
  702. rend = 1;
  703. }
  704. me.mx += pos.x;
  705. me.my += pos.y;
  706. }
  707. void KarteAuswahlFenster::render( Bild &zrObj )
  708. {
  709. int x = pos.x;
  710. int y = pos.y;
  711. int br = gr.x;
  712. int hö = gr.y;
  713. if( !zrObj.setDrawOptions( x, y, br, hö ) )
  714. return;
  715. zrObj.setAlpha( alpha );
  716. rahmen->setSize( br, hö );
  717. rahmen->render( zrObj );
  718. int rbr = rahmen->getRBreite();
  719. if( !zrObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
  720. {
  721. zrObj.releaseDrawOptions();
  722. zrObj.releaseAlpha();
  723. return;
  724. }
  725. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  726. members->z( i )->render( zrObj );
  727. zrObj.releaseDrawOptions();
  728. if( !anzahl )
  729. {
  730. Text t = "Dieser Account besitzt momentan noch keine Karten für dieses Spiel.\nBesuche den Shop um neue Karten zu erwerben!";
  731. tr->setSchriftSize( 12 );
  732. tr->renderText( 10, 10, t, zrObj, 0xFFFFFFFF );
  733. }
  734. zrObj.releaseDrawOptions();
  735. zrObj.releaseAlpha();
  736. }
  737. // constant
  738. int KarteAuswahlFenster::getAnzahl() const
  739. {
  740. return anzahl;
  741. }
  742. int KarteAuswahlFenster::getSeiteAnzahl() const
  743. {
  744. return ( anzahl / 4.0 == anzahl / 4 ) ? ( anzahl / 4 ) : ( anzahl / 4 + 1 );
  745. }
  746. int KarteAuswahlFenster::getSeite() const
  747. {
  748. return seite;
  749. }
  750. int KarteAuswahlFenster::getAnzahlAufSeite() const
  751. {
  752. return ( anzahl < seite * 4 + 4 ) ? ( anzahl - seite * 4 ) : 4;
  753. }
  754. bool KarteAuswahlFenster::hatAuswahl() const
  755. {
  756. return auswahl != -1;
  757. }
  758. KarteDaten *KarteAuswahlFenster::getAuswahl() const
  759. {
  760. return members->get( auswahl );
  761. }
  762. // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
  763. Thread *KarteAuswahlFenster::release()
  764. {
  765. if( ref == 2 && run )
  766. {
  767. warteAufThread( 5000 );
  768. ende();
  769. }
  770. return Thread::release();
  771. }