KarteAuswahl.cpp 21 KB

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