SpielAuswahl.cpp 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030
  1. #include "SpielAuswahl.h"
  2. #include <Datei.h>
  3. #include <Text.h>
  4. #include <Schrift.h>
  5. #include <Rahmen.h>
  6. #include <Punkt.h>
  7. #include <DateiSystem.h>
  8. #include "..\..\..\Global\Initialisierung.h"
  9. #include <AlphaFeld.h>
  10. #include <MausEreignis.h>
  11. #include <KSGTDatei.h>
  12. #include "..\..\..\Global\Variablen.h"
  13. void SpielAuswahlKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
  14. {
  15. if( !p )
  16. return;
  17. ( (SpielDaten*)p )->ksgsAktion( parameter, retVal );
  18. }
  19. SpielDaten::Loader::Loader( SpielDaten *sd, int aktion )
  20. {
  21. this->sd = sd;
  22. this->aktion = aktion;
  23. beenden = 0;
  24. ref = 2;
  25. start();
  26. }
  27. void SpielDaten::Loader::setBeenden()
  28. {
  29. beenden = 1;
  30. }
  31. void SpielDaten::Loader::thread()
  32. {
  33. Text *pfad = new Text( "data/spiele/" );
  34. pfad->append( sd->name->getText() );
  35. pfad->append( "/data/game.ini" );
  36. if( !DateiExistiert( pfad->getThis() ) )
  37. {
  38. if( !aktion )
  39. {
  40. if( sd->aAnimation )
  41. sd->aAnimation->setSichtbar( 0 );
  42. sd->geladen = 0;
  43. sd->ausgewählt = 0;
  44. hauptScreen->lock();
  45. if( sd->aAnimation )
  46. sd->aAnimation = sd->aAnimation->release();
  47. hauptScreen->unlock();
  48. if( sd->hintergrund )
  49. sd->hintergrund = sd->hintergrund->release();
  50. if( sd->beschreibung )
  51. {
  52. sd->beschreibung->zurücksetzen();
  53. sd->beschreibung = sd->beschreibung->release();
  54. }
  55. if( sd->ksgs )
  56. {
  57. dllDateien->releaseDLL( "KSGScript.dll" );
  58. sd->ksgs = 0;
  59. }
  60. }
  61. else
  62. {
  63. if( !sd->hintergrund )
  64. sd->hintergrund = new Bild();
  65. sd->hintergrund->neuBild( 200, 100, 0xFF000000 );
  66. sd->schrift->lock();
  67. sd->schrift->setSchriftSize( 12 );
  68. sd->schrift->setDrawPosition( 10, 10 );
  69. sd->schrift->renderText( sd->name, *sd->hintergrund, 0xFFFFFFFF );
  70. sd->schrift->unlock();
  71. if( !sd->geladen )
  72. sd->geladen = 1;
  73. sd->rend = 1;
  74. int dgId = infoClient->getDateiGruppeIdVonSpiel( sd->spielId );
  75. if( dgId )
  76. {
  77. KSGTDatei *dg = new KSGTDatei( "data/dg.ksgt" );
  78. dg->laden();
  79. bool gefunden = 0;
  80. for( int i = 0; i < dg->getZeilenAnzahl(); i++ )
  81. {
  82. if( dg->zFeld( i, 0 ) && TextZuInt( dg->zFeld( i, 0 )->getText(), 10 ) == dgId )
  83. {
  84. gefunden = 1;
  85. break;
  86. }
  87. }
  88. if( !gefunden )
  89. {
  90. for( int i = 0; i < dg->getZeilenAnzahl(); i++ )
  91. {
  92. if( dg->zFeld( i, 3 ) && !dg->zFeld( i, 3 )->istGleich( "SOFORT" ) && !dg->zFeld( i, 3 )->istGleich( "NICHT" ) )
  93. {
  94. int platz = TextZuInt( dg->zFeld( i, 3 )->getText(), 10 ) + 1;
  95. Text *plT = new Text();
  96. plT->append( platz );
  97. dg->zFeld( i, 3 )->setText( plT );
  98. }
  99. }
  100. Text *idT = new Text();
  101. idT->append( dgId );
  102. Text *pfad = infoClient->getDateiGruppePfad( dgId );
  103. if( pfad )
  104. {
  105. RCArray< Text > *zeile = new RCArray< Text >();
  106. zeile->add( idT );
  107. zeile->add( pfad );
  108. zeile->add( new Text( "0" ) );
  109. zeile->add( new Text( "0" ) );
  110. dg->addZeile( 4, zeile );
  111. zeile->release();
  112. }
  113. else
  114. idT->release();
  115. }
  116. dg->speichern();
  117. dg->release();
  118. }
  119. if( aktion == 2 && !beenden )
  120. {
  121. if( sd->beschreibung )
  122. {
  123. sd->beschreibung->zurücksetzen();
  124. sd->beschreibung = sd->beschreibung->release();
  125. }
  126. if( !sd->ksgs )
  127. sd->ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
  128. if( sd->ksgs )
  129. {
  130. KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( sd->ksgs, KSGS_START_FUNKTION );
  131. if( getKSGScript )
  132. {
  133. sd->beschreibung = getKSGScript();
  134. sd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
  135. sd->beschreibung->setSchriftZ( sd->schrift->getThis() );
  136. sd->beschreibung->setSize( 578, 428 );
  137. sd->beschreibung->setRückrufParam( sd );
  138. sd->beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
  139. sd->beschreibung->setScriptDatei( "data/script/SpielNichtAktuell.ksgs" );
  140. }
  141. else
  142. {
  143. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  144. new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
  145. "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
  146. new Text( "Ok" ), 0 );
  147. }
  148. }
  149. else
  150. {
  151. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  152. new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
  153. new Text( "Ok" ), 0 );
  154. }
  155. if( sd->beschreibung )
  156. sd->geladen = 2;
  157. if( sd->beschreibung && sd->ksgs && sd->ausgewählt )
  158. sd->beschreibung->neuLaden();
  159. }
  160. }
  161. pfad->release();
  162. sd->rend = 1;
  163. return;
  164. }
  165. Datei *ini = new Datei();
  166. ini->setDatei( pfad->getText() );
  167. ini->open( Datei::Style::lesen );
  168. if( !aktion )
  169. {
  170. if( sd->aAnimation )
  171. sd->aAnimation->setSichtbar( 0 );
  172. sd->geladen = 0;
  173. sd->ausgewählt = 0;
  174. hauptScreen->lock();
  175. if( sd->aAnimation )
  176. sd->aAnimation = sd->aAnimation->release();
  177. hauptScreen->unlock();
  178. if( sd->hintergrund )
  179. sd->hintergrund = sd->hintergrund->release();
  180. if( sd->beschreibung )
  181. {
  182. sd->beschreibung->zurücksetzen();
  183. sd->beschreibung = sd->beschreibung->release();
  184. }
  185. if( sd->ksgs )
  186. {
  187. dllDateien->releaseDLL( "KSGScript.dll" );
  188. sd->ksgs = 0;
  189. }
  190. sd->rend = 1;
  191. }
  192. else
  193. {
  194. Text *pf = ini->leseZeile();
  195. pf->remove( pf->getLength() - 1 );
  196. pf->insert( 0, "/bilder/" );
  197. pf->insert( 0, sd->name->getText() );
  198. pf->insert( 0, "data/spiele/" );
  199. if( pf->hat( ".ltdb/" ) )
  200. {
  201. if( !sd->hintergrund )
  202. {
  203. LTDBDatei *bildDatei = new LTDBDatei();
  204. bildDatei->setDatei( pf->getTeilText( 0, pf->positionVon( ".ltdb" ) + 5 ) );
  205. bildDatei->leseDaten( 0 );
  206. sd->hintergrund = bildDatei->laden( 0, pf->getTeilText( pf->positionVon( ".ltdb" ) + 6 ) );
  207. bildDatei->release();
  208. }
  209. }
  210. else
  211. {
  212. if( !sd->hintergrund )
  213. {
  214. LTDBDatei *bildDatei = new LTDBDatei();
  215. bildDatei->setDatei( pf->getThis() );
  216. bildDatei->leseDaten( 0 );
  217. sd->hintergrund = bildDatei->laden( 0, bildDatei->zBildListe()->get( 0 ) );
  218. bildDatei->release();
  219. }
  220. }
  221. pf->release();
  222. pf = ini->leseZeile();
  223. pf->release();
  224. pf = ini->leseZeile();
  225. pf->remove( pf->getLength() - 1 );
  226. pf->insert( 0, "/data/" );
  227. pf->insert( 0, sd->name->getText() );
  228. pf->insert( 0, "data/spiele/" );
  229. Datei *idDatei = new Datei();
  230. idDatei->setDatei( pf->getText() );
  231. idDatei->open( Datei::Style::lesen );
  232. idDatei->lese( (char*)&sd->spielId, 4 );
  233. idDatei->close();
  234. idDatei->release();
  235. pf->release();
  236. if( !sd->geladen )
  237. sd->geladen = 1;
  238. sd->rend = 1;
  239. ini->setLPosition( 0, 0 );
  240. if( aktion == 2 && !beenden )
  241. {
  242. pf = ini->leseZeile();
  243. pf->remove( pf->getLength() - 1 );
  244. pf->insert( 0, "/bilder/" );
  245. pf->insert( 0, sd->name->getText() );
  246. pf->insert( 0, "data/spiele/" );
  247. if( !pf->hat( ".ltdb/" ) )
  248. {
  249. LTDBDatei *add = new LTDBDatei();
  250. add->setDatei( pf->getThis() );
  251. add->leseDaten( 0 );
  252. Animation2DData *ad = new Animation2DData();
  253. ad->ladeAnimation( add );
  254. ad->setWiederhohlend( 1 );
  255. ad->setFPS( 30 );
  256. hauptScreen->lock();
  257. if( sd->aAnimation )
  258. sd->aAnimation = sd->aAnimation->release();
  259. sd->aAnimation = new Animation2D();
  260. hauptScreen->unlock();
  261. sd->aAnimation->setSize( 200, 100 );
  262. sd->aAnimation->setPosition( 0, 0 );
  263. sd->aAnimation->setAnimationDataZ( ad );
  264. }
  265. pf->release();
  266. pf = ini->leseZeile();
  267. pf->remove( pf->getLength() - 1 );
  268. pf->insert( 0, "/data/" );
  269. pf->insert( 0, sd->name->getText() );
  270. pf->insert( 0, "data/spiele/" );
  271. if( sd->beschreibung )
  272. {
  273. sd->beschreibung->zurücksetzen();
  274. sd->beschreibung = sd->beschreibung->release();
  275. }
  276. if( !sd->ksgs )
  277. sd->ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
  278. if( sd->ksgs )
  279. {
  280. KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( sd->ksgs, KSGS_START_FUNKTION );
  281. if( getKSGScript )
  282. {
  283. sd->beschreibung = getKSGScript();
  284. sd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
  285. sd->beschreibung->setSchriftZ( sd->schrift->getThis() );
  286. sd->beschreibung->setSize( 578, 428 );
  287. sd->beschreibung->setRückrufParam( sd );
  288. sd->beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
  289. sd->beschreibung->setScriptDatei( pf->getText() );
  290. }
  291. else
  292. {
  293. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  294. new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
  295. "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
  296. new Text( "Ok" ), 0 );
  297. }
  298. }
  299. else
  300. {
  301. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  302. new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
  303. new Text( "Ok" ), 0 );
  304. }
  305. pf->release();
  306. if( sd->beschreibung )
  307. sd->geladen = 2;
  308. if( sd->beschreibung && sd->ksgs && sd->ausgewählt )
  309. sd->beschreibung->neuLaden();
  310. sd->rend = 1;
  311. }
  312. }
  313. pfad->release();
  314. ini->close();
  315. ini->release();
  316. if( !sd->erlaubt )
  317. sd->updateErlaubt();
  318. sd->rend = 1;
  319. release();
  320. }
  321. SpielDaten::Loader *SpielDaten::Loader::release()
  322. {
  323. if( !--ref )
  324. delete this;
  325. return 0;
  326. }
  327. int SpielDaten::Loader::getAktion() const
  328. {
  329. return aktion;
  330. }
  331. // Inhalt der SpielDaten Klasse aus SpielAuswahl.h
  332. // Konstruktor
  333. SpielDaten::SpielDaten( Schrift *zSchrift, const char *name, int id )
  334. {
  335. this->name = new Text( name );
  336. hintergrund = 0;
  337. aAnimation = 0;
  338. beschreibung = 0;
  339. ksgs = 0;
  340. rahmen = new LRahmen();
  341. rahmen->setFarbe( 0xFFFFFFFF );
  342. rahmen->setRamenBreite( 1 );
  343. tickVal = 0;
  344. animation = 0;
  345. ausgewählt = 0;
  346. pos = Punkt( 0, 500 );
  347. gr = Punkt( 200, 100 );
  348. schrift = zSchrift->getThis();
  349. spielId = id;
  350. geladen = 0;
  351. erlaubt = 0;
  352. auswahl = new AlphaFeld();
  353. auswahl->setFarbe( 0x0000FF00 );
  354. auswahl->setStrength( 8 );
  355. auswahl->setSize( 200, 100 );
  356. ladenBild = 0;
  357. rend = 0;
  358. ref = 1;
  359. alpha = 0;
  360. tAlpha = 0;
  361. loader = new Loader( this, 1 );
  362. }
  363. // Destruktor
  364. SpielDaten::~SpielDaten()
  365. {
  366. if( loader && loader->isRunning() )
  367. loader->warteAufThread( INT_MAX );
  368. loader->release();
  369. if( schrift )
  370. schrift->release();
  371. name->release();
  372. if( hintergrund )
  373. hintergrund->release();
  374. if( aAnimation )
  375. aAnimation->release();
  376. if( beschreibung )
  377. {
  378. beschreibung->zurücksetzen();
  379. beschreibung->release();
  380. }
  381. if( ksgs )
  382. {
  383. dllDateien->releaseDLL( "KSGScript.dll" );
  384. ksgs = 0;
  385. }
  386. rahmen->release();
  387. auswahl->release();
  388. }
  389. // nicht constant
  390. void SpielDaten::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
  391. {}
  392. void SpielDaten::setSichtbar( bool sichtbar )
  393. {
  394. if( sichtbar )
  395. animation |= 0x1;
  396. else
  397. {
  398. animation &= ~0x1;
  399. setAuswahl( 0 );
  400. auswahl->setFarbe( auswahl->getFarbe() & 0xFFFFFF );
  401. }
  402. hauptScreen->lock();
  403. if( loader->getAktion() == (sichtbar ? 2 : 0) )
  404. {
  405. hauptScreen->unlock();
  406. rend = 1;
  407. return;
  408. }
  409. loader->setBeenden();
  410. Loader *altLoader = loader;
  411. loader = new Loader( this, sichtbar ? 2 : 0 );
  412. altLoader->release();
  413. hauptScreen->unlock();
  414. rend = 1;
  415. }
  416. void SpielDaten::setSichtbar()
  417. {
  418. animation |= 1;
  419. if( ausgewählt && geladen == 2 )
  420. {
  421. animation |= 0x4;
  422. beschreibung->setPosition( beschreibung->getX(), 0 );
  423. }
  424. hauptScreen->lock();
  425. if( geladen != 2 && loader->getAktion() != 2 )
  426. {
  427. Loader *altLoader = loader;
  428. loader = new Loader( this, 2 );
  429. altLoader->release();
  430. }
  431. hauptScreen->unlock();
  432. rend = 1;
  433. }
  434. void SpielDaten::setAuswahl( bool auswahl )
  435. {
  436. if( ausgewählt == auswahl )
  437. return;
  438. ausgewählt = auswahl;
  439. if( auswahl )
  440. {
  441. if( aAnimation )
  442. aAnimation->setSichtbar( 1 );
  443. if( beschreibung && ksgs )
  444. beschreibung->neuLaden();
  445. animation |= 0x4;
  446. }
  447. else
  448. animation &= ~0x4;
  449. rend = 1;
  450. }
  451. void SpielDaten::updateErlaubt()
  452. {
  453. bool update = erlaubt;
  454. erlaubt = 0;
  455. KSGTDatei *dgt = new KSGTDatei( "data/dg.ksgt" );
  456. dgt->laden();
  457. bool ak = 0;
  458. int dgId = infoClient->getDateiGruppeIdVonSpiel( spielId );
  459. for( int i = 0; i < dgt->getZeilenAnzahl(); i++ )
  460. {
  461. if( dgt->zFeld( i, 0 ) && TextZuInt( dgt->zFeld( i, 0 )->getText(), 10 ) == dgId )
  462. {
  463. int lv = dgt->zFeld( i, 2 ) ? TextZuInt( dgt->zFeld( i, 2 )->getText(), 10 ) : 0;
  464. int ov = infoClient->getSpielVersion( spielId );
  465. if( lv == ov )
  466. ak = 1;
  467. break;
  468. }
  469. }
  470. dgt->release();
  471. erlaubt = ak && infoClient->istSpielErlaubt( spielId );
  472. if( !erlaubt && !ak && !updateH->hat( dgId ) )
  473. {
  474. Text msg = "Das Spiel '";
  475. msg += name->getText();
  476. msg += "' muss aktualisiert werden.";
  477. nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( schrift, new Text( "Update" ), msg.getThis(), dgId, []()
  478. {
  479. if( nachLogin && nachLogin->zSpielenFenster() )
  480. nachLogin->zSpielenFenster()->updateErlaubt();
  481. } ) );
  482. }
  483. }
  484. void SpielDaten::setPosition( int lPos )
  485. {
  486. pos.y = lPos * 100;
  487. rend = 1;
  488. }
  489. bool SpielDaten::tick( double tickVal )
  490. {
  491. if( beschreibung )
  492. rend |= beschreibung->tick( tickVal );
  493. this->tickVal += tickVal * 500;
  494. int val = ( int ) this->tickVal;
  495. if( val < 1 )
  496. {
  497. bool ret = rend;
  498. rend = 0;
  499. return ret;
  500. }
  501. if( val > 17 )
  502. val = 17;
  503. this->tickVal -= val;
  504. if( aAnimation && geladen == 2 && aAnimation->istSichtbar() )
  505. {
  506. if( aAnimation->getJetzt() + 1 >= aAnimation->zAnimationData()->getBildAnzahl() )
  507. {
  508. rend |= aAnimation->tick( tickVal );
  509. if( aAnimation->getJetzt() + 1 < aAnimation->zAnimationData()->getBildAnzahl() )
  510. aAnimation->setSichtbar( 0 );
  511. }
  512. else
  513. rend |= aAnimation->tick( tickVal );
  514. }
  515. if( ausgewählt )
  516. {
  517. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  518. if( a != 150 )
  519. {
  520. if( a + val > 150 )
  521. a = 150;
  522. else
  523. a += val;
  524. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  525. rend = 1;
  526. }
  527. }
  528. else
  529. {
  530. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  531. if( a != 0 )
  532. {
  533. if( a - val < 0 )
  534. a = 0;
  535. else
  536. a -= val;
  537. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  538. rend = 1;
  539. }
  540. }
  541. if( ( animation | 0x1 ) == animation ) // sichtbar
  542. {
  543. if( tAlpha != 255 )
  544. {
  545. if( tAlpha + val > 255 )
  546. tAlpha = 255;
  547. else
  548. tAlpha += val;
  549. rend = 1;
  550. }
  551. }
  552. else // unsichtbar
  553. {
  554. if( tAlpha != 0 )
  555. {
  556. if( tAlpha - val < 0 )
  557. tAlpha = 0;
  558. else
  559. tAlpha -= val;
  560. rend = 1;
  561. }
  562. }
  563. if( geladen == 2 )
  564. {
  565. if( ( animation | 0x4 ) == animation ) // auswählen
  566. {
  567. if( beschreibung )
  568. {
  569. if( alpha != 255 )
  570. {
  571. if( alpha + val < 255 )
  572. alpha += val;
  573. else
  574. alpha = 255;
  575. rend = 1;
  576. }
  577. }
  578. }
  579. else // abwählen
  580. {
  581. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  582. if( a != 0 )
  583. {
  584. a -= val;
  585. if( a < 0 )
  586. a = 0;
  587. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  588. rend = 1;
  589. }
  590. if( beschreibung )
  591. {
  592. if( alpha != 0 )
  593. {
  594. if( alpha - val > 0 )
  595. alpha -= val;
  596. else
  597. alpha = 0;
  598. rend = 1;
  599. }
  600. }
  601. }
  602. }
  603. bool ret = rend;
  604. rend = 0;
  605. return ret;
  606. }
  607. void SpielDaten::doMausEreignis( MausEreignis &me )
  608. {
  609. if( !erlaubt && ausgewählt )
  610. {
  611. me.mx -= gr.x + 90;
  612. me.mx += 90;
  613. if( beschreibung )
  614. beschreibung->doMausEreignis( me );
  615. me.mx += gr.x;
  616. }
  617. }
  618. void SpielDaten::render( Bild &zRObj )
  619. {
  620. int x = pos.x;
  621. int y = pos.y;
  622. int br = gr.x;
  623. int hö = gr.y;
  624. if( !zRObj.setDrawOptions( x, y, br, hö ) )
  625. return;
  626. zRObj.setAlpha( tAlpha );
  627. rahmen->setSize( br, hö );
  628. int rbr = rahmen->getRBreite();
  629. if( geladen && hintergrund && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
  630. zRObj.drawBild( rbr, rbr, br - rbr * 2, hö - rbr * 2, *hintergrund );
  631. if( aAnimation )
  632. aAnimation->render( zRObj );
  633. rahmen->render( zRObj );
  634. if( auswahl && ( ( auswahl->getFarbe() >> 24 ) & 0xFF ) && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
  635. {
  636. auswahl->setPosition( rbr, rbr );
  637. auswahl->setSize( br - rbr * 2, hö - rbr * 2 );
  638. auswahl->render( zRObj );
  639. }
  640. zRObj.releaseDrawOptions();
  641. x = br;
  642. y = 0;
  643. br = 580;
  644. hö = 480;
  645. if( !zRObj.setDrawOptions( x, y, br, hö ) )
  646. {
  647. zRObj.releaseAlpha();
  648. return;
  649. }
  650. if( geladen == 2 && beschreibung )
  651. {
  652. zRObj.setAlpha( alpha );
  653. beschreibung->render( zRObj );
  654. zRObj.releaseAlpha();
  655. }
  656. if( ausgewählt && geladen != 2 && ladeAnimation->zAnimationData() )
  657. {
  658. ladenBild++;
  659. if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
  660. ladenBild = 0;
  661. zRObj.drawBild( 275, 195, 50, 50, *ladeAnimation->zAnimationData()->zBild( ladenBild ) );
  662. rend = 1;
  663. }
  664. zRObj.releaseDrawOptions();
  665. zRObj.releaseAlpha();
  666. }
  667. // constant
  668. int SpielDaten::getSpielId() const
  669. {
  670. return spielId;
  671. }
  672. bool SpielDaten::istausgewählt() const
  673. {
  674. return ausgewählt;
  675. }
  676. Text *SpielDaten::zName() const
  677. {
  678. return name;
  679. }
  680. bool SpielDaten::istErlaubt() const
  681. {
  682. return erlaubt;
  683. }
  684. // Reference Counting
  685. SpielDaten *SpielDaten::getThis()
  686. {
  687. ref++;
  688. return this;
  689. }
  690. SpielDaten *SpielDaten::release()
  691. {
  692. ref--;
  693. if( !ref )
  694. delete this;
  695. return 0;
  696. }
  697. // Inhalt der SpielAuswahl Klasse aus SpielAuswahl.h
  698. // Konstruktor
  699. SpielAuswahlFenster::SpielAuswahlFenster( Schrift *zSchrift )
  700. : Thread()
  701. {
  702. schrift = zSchrift->getThis();
  703. rahmen = new LRahmen();
  704. rahmen->setFarbe( 0xFFFFFFFF );
  705. rahmen->setRamenBreite( 1 );
  706. rahmen->setSize( 760, 500 );
  707. members = new RCArray< SpielDaten >();
  708. anzahl = 0;
  709. animation = 0;
  710. auswahl = -1;
  711. tickVal = 0;
  712. seite = 0;
  713. pos = Punkt( 10, 10 );
  714. gr = Punkt( 780, 430 );
  715. rend = 0;
  716. ref = 1;
  717. alpha = 0;
  718. start();
  719. }
  720. // Destruktor
  721. SpielAuswahlFenster::~SpielAuswahlFenster()
  722. {
  723. if( run )
  724. {
  725. warteAufThread( 5000 );
  726. ende();
  727. }
  728. if( schrift )
  729. schrift->release();
  730. if( rahmen )
  731. rahmen->release();
  732. if( members )
  733. members->release();
  734. }
  735. // nicht constant
  736. void SpielAuswahlFenster::setSichtbar( bool sichtbar )
  737. {
  738. if( sichtbar )
  739. {
  740. animation |= 0x1;
  741. start();
  742. }
  743. else
  744. {
  745. auswahl = -1;
  746. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  747. members->z( i )->setSichtbar( 0 );
  748. animation &= ~0x1;
  749. }
  750. rend = 1;
  751. }
  752. void SpielAuswahlFenster::blättern( bool oben )
  753. {
  754. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  755. members->z( i )->setSichtbar( 0 );
  756. seite += oben ? 1 : -1;
  757. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  758. {
  759. members->z( i )->setPosition( i % 4 );
  760. members->z( i )->setSichtbar( 1 );
  761. }
  762. auswahl = -1;
  763. rend = 1;
  764. }
  765. void SpielAuswahlFenster::updateListe()
  766. {
  767. if( run )
  768. return;
  769. start();
  770. }
  771. void SpielAuswahlFenster::thread()
  772. {
  773. Array< int > *liste = infoClient->getAccountSpielArtListe();
  774. if( !liste )
  775. {
  776. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( infoClient->getLetzterFehler() ),
  777. new Text( "Ok" ), 0 );
  778. run = 0;
  779. return;
  780. }
  781. int anz = liste->getEintragAnzahl();
  782. for( int i = 0; i < anz; i++ )
  783. {
  784. Text *name = infoClient->getSpielName( liste->hat( i ) ? liste->get( i ) : 0 );
  785. if( name )
  786. {
  787. bool gefunden = 0;
  788. for( int j = 0; j < anzahl; j++ )
  789. {
  790. SpielDaten *tmp = members->z( j );
  791. if( liste->hat( i ) && tmp->getSpielId() == liste->get( i ) )
  792. {
  793. gefunden = 1;
  794. break;
  795. }
  796. }
  797. if( !gefunden )
  798. {
  799. SpielDaten *tmp = new SpielDaten( schrift, name->getText(), liste->hat( i ) ? liste->get( i ) : 0 );
  800. members->add( tmp, anzahl );
  801. anzahl++;
  802. }
  803. name->release();
  804. }
  805. }
  806. if( liste )
  807. liste->release();
  808. for( int i = 0; i < anzahl; i++ )
  809. members->z( i )->updateErlaubt();
  810. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  811. {
  812. members->z( i )->setPosition( i % 4 );
  813. members->z( i )->setSichtbar();
  814. }
  815. rend = 1;
  816. run = 0;
  817. }
  818. bool SpielAuswahlFenster::tick( double tickVal )
  819. {
  820. for( int i = 0; i < anzahl; i++ )
  821. rend |= members->z( i )->tick( tickVal );
  822. this->tickVal += tickVal * 750;
  823. int val = ( int )this->tickVal;
  824. if( val < 1 )
  825. {
  826. bool ret = rend;
  827. rend = 0;
  828. return ret;
  829. }
  830. if( val > 25 )
  831. val = 25;
  832. this->tickVal -= val;
  833. if( ( animation | 0x1 ) == animation ) // sichtbar
  834. {
  835. if( alpha < 255 )
  836. {
  837. if( alpha + val >= 255 )
  838. {
  839. alpha = 255;
  840. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  841. {
  842. members->z( i )->setPosition( i % 4 );
  843. members->z( i )->setSichtbar( 1 );
  844. }
  845. }
  846. else
  847. alpha += val;
  848. rend = 1;
  849. }
  850. }
  851. else // unsichtbar
  852. {
  853. if( alpha > 0 )
  854. {
  855. if( alpha - val < 0 )
  856. alpha = 0;
  857. else
  858. alpha -= val;
  859. rend = 1;
  860. }
  861. }
  862. bool ret = rend;
  863. rend = 0;
  864. return ret;
  865. }
  866. void SpielAuswahlFenster::doMausEreignis( MausEreignis &me )
  867. {
  868. if( pos.x != 10 )
  869. return;
  870. me.mx -= pos.x;
  871. me.my -= pos.y;
  872. for( int i = 0; i < anzahl; i++ )
  873. members->z( i )->doMausEreignis( me );
  874. if( me.mx < 0 || me.my < 0 )
  875. {
  876. me.mx += pos.x;
  877. me.my += pos.y;
  878. return;
  879. }
  880. if( me.mx > 200 || me.my > getAnzahlAufSeite() * 100 )
  881. {
  882. me.mx += pos.x;
  883. me.my += pos.y;
  884. return;
  885. }
  886. if( me.id == ME_RLinks )
  887. {
  888. int treffer = me.my / 100 + seite * 4;
  889. if( treffer >= anzahl )
  890. {
  891. me.mx += pos.x;
  892. me.my += pos.y;
  893. return;
  894. }
  895. if( treffer == auswahl )
  896. {
  897. me.mx += pos.x;
  898. me.my += pos.y;
  899. return;
  900. }
  901. if( auswahl >= 0 )
  902. members->z( auswahl )->setAuswahl( 0 );
  903. members->z( treffer )->setAuswahl( 1 );
  904. auswahl = treffer;
  905. rend = 1;
  906. }
  907. me.mx += pos.x;
  908. me.my += pos.y;
  909. }
  910. void SpielAuswahlFenster::render( Bild &zrObj )
  911. {
  912. int x = pos.x;
  913. int y = pos.y;
  914. int br = gr.x;
  915. int hö = gr.y;
  916. if( !zrObj.setDrawOptions( x, y, br, hö ) )
  917. return;
  918. zrObj.setAlpha( alpha );
  919. rahmen->setSize( br, hö );
  920. rahmen->render( zrObj );
  921. int rbr = rahmen->getRBreite();
  922. if( !zrObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
  923. {
  924. zrObj.releaseDrawOptions();
  925. zrObj.releaseAlpha();
  926. return;
  927. }
  928. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  929. members->z( i )->render( zrObj );
  930. zrObj.releaseDrawOptions();
  931. if( !anzahl )
  932. {
  933. Text t = "Dieser Account besitzt momentan noch keine Spiele.\nBesuche den Shop um neue Spiele zu erwerben!";
  934. schrift->lock();
  935. schrift->setDrawPosition( 10, 10 );
  936. schrift->setSchriftSize( 12 );
  937. schrift->renderText( &t, zrObj, 0xFFFFFFFF );
  938. schrift->unlock();
  939. }
  940. zrObj.releaseDrawOptions();
  941. zrObj.releaseAlpha();
  942. }
  943. // constant
  944. int SpielAuswahlFenster::getAnzahl() const
  945. {
  946. return anzahl;
  947. }
  948. int SpielAuswahlFenster::getSeiteAnzahl() const
  949. {
  950. return ( anzahl / 4.0 == anzahl / 4 ) ? ( anzahl / 4 ) : ( anzahl / 4 + 1 );
  951. }
  952. int SpielAuswahlFenster::getSeite() const
  953. {
  954. return seite;
  955. }
  956. int SpielAuswahlFenster::getAnzahlAufSeite() const
  957. {
  958. return ( anzahl < seite * 4 + 4 ) ? ( anzahl - seite * 4 ) : 4;
  959. }
  960. bool SpielAuswahlFenster::hatAuswahl() const
  961. {
  962. return auswahl != -1;
  963. }
  964. SpielDaten *SpielAuswahlFenster::getAuswahl() const
  965. {
  966. return members->get( auswahl );
  967. }
  968. SpielDaten *SpielAuswahlFenster::zAuswahl() const
  969. {
  970. return members->z( auswahl );
  971. }
  972. bool SpielAuswahlFenster::istAuswahlErlubt() const
  973. {
  974. return auswahl != -1 && members->z( auswahl )->istErlaubt();
  975. }
  976. // Reference Counting
  977. SpielAuswahlFenster *SpielAuswahlFenster::getThis()
  978. {
  979. ref++;
  980. return this;
  981. }
  982. SpielAuswahlFenster *SpielAuswahlFenster::release()
  983. {
  984. ref--;
  985. if( !ref )
  986. delete this;
  987. return 0;
  988. }