SpielAuswahl.cpp 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  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, NachrichtType::nachricht, 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, NachrichtType::nachricht, 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. hauptScreen->lock();
  250. if( sd->aAnimation )
  251. sd->aAnimation = sd->aAnimation->release();
  252. hauptScreen->unlock();
  253. LTDBDatei *add = new LTDBDatei();
  254. add->setDatei( pf->getThis() );
  255. add->leseDaten( 0 );
  256. Animation2DData *ad = new Animation2DData();
  257. ad->ladeAnimation( add );
  258. ad->setWiederhohlend( 1 );
  259. ad->setFPS( 30 );
  260. sd->aAnimation = new Animation2D();
  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, NachrichtType::nachricht, 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, NachrichtType::nachricht, 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. if( !erlaubt && sichtbar && ausgewählt )
  403. updateH->setSichtbar( spielId, 1 );
  404. hauptScreen->lock();
  405. if( loader->getAktion() == (sichtbar ? 2 : 0) )
  406. {
  407. hauptScreen->unlock();
  408. rend = 1;
  409. return;
  410. }
  411. loader->setBeenden();
  412. Loader *altLoader = loader;
  413. loader = new Loader( this, sichtbar ? 2 : 0 );
  414. altLoader->release();
  415. hauptScreen->unlock();
  416. rend = 1;
  417. }
  418. void SpielDaten::setSichtbar()
  419. {
  420. animation |= 1;
  421. if( ausgewählt && geladen == 2 )
  422. {
  423. animation |= 0x4;
  424. beschreibung->setPosition( beschreibung->getX(), 0 );
  425. }
  426. if( !erlaubt && ausgewählt )
  427. updateH->setSichtbar( spielId, 1 );
  428. hauptScreen->lock();
  429. if( geladen != 2 && loader->getAktion() != 2 )
  430. {
  431. Loader *altLoader = loader;
  432. loader = new Loader( this, 2 );
  433. altLoader->release();
  434. }
  435. hauptScreen->unlock();
  436. rend = 1;
  437. }
  438. void SpielDaten::setAuswahl( bool auswahl )
  439. {
  440. if( ausgewählt == auswahl )
  441. return;
  442. ausgewählt = auswahl;
  443. if( auswahl )
  444. {
  445. if( aAnimation )
  446. aAnimation->setSichtbar( 1 );
  447. if( beschreibung && ksgs )
  448. beschreibung->neuLaden();
  449. animation |= 0x4;
  450. }
  451. else
  452. animation &= ~0x4;
  453. if( !erlaubt && ausgewählt )
  454. updateH->setSichtbar( spielId, 1 );
  455. if( !erlaubt && !ausgewählt )
  456. updateH->setSichtbar( spielId, 0 );
  457. rend = 1;
  458. }
  459. void SpielDaten::updateErlaubt()
  460. {
  461. bool update = erlaubt;
  462. erlaubt = 0;
  463. KSGTDatei *dgt = new KSGTDatei( "data/dg.ksgt" );
  464. dgt->laden();
  465. bool ak = 0;
  466. int dgId = infoClient->getDateiGruppeIdVonSpiel( spielId );
  467. for( int i = 0; i < dgt->getZeilenAnzahl(); i++ )
  468. {
  469. if( dgt->zFeld( i, 0 ) && TextZuInt( dgt->zFeld( i, 0 )->getText(), 10 ) == dgId )
  470. {
  471. int lv = dgt->zFeld( i, 2 ) ? TextZuInt( dgt->zFeld( i, 2 )->getText(), 10 ) : 0;
  472. int ov = infoClient->getSpielVersion( spielId );
  473. if( lv == ov )
  474. ak = 1;
  475. break;
  476. }
  477. }
  478. dgt->release();
  479. erlaubt = ak && infoClient->istSpielErlaubt( spielId );
  480. if( !erlaubt && !updateH->hat( spielId ) )
  481. {
  482. updateH->erstellen( schrift, spielId );
  483. if( ausgewählt )
  484. updateH->setSichtbar( spielId, 1 );
  485. }
  486. if( erlaubt && updateH->hat( spielId ) )
  487. updateH->remove( spielId, 0 );
  488. }
  489. void SpielDaten::setPosition( int lPos )
  490. {
  491. pos.y = lPos * 100;
  492. rend = 1;
  493. }
  494. bool SpielDaten::tick( double tickVal )
  495. {
  496. if( beschreibung )
  497. rend |= beschreibung->tick( tickVal );
  498. if( !erlaubt )
  499. rend |= updateH->tick( spielId, tickVal );
  500. this->tickVal += tickVal * 500;
  501. int val = ( int ) this->tickVal;
  502. if( val < 1 )
  503. {
  504. bool ret = rend;
  505. rend = 0;
  506. return ret;
  507. }
  508. if( val > 17 )
  509. val = 17;
  510. this->tickVal -= val;
  511. if( aAnimation && geladen == 2 && aAnimation->istSichtbar() )
  512. {
  513. if( aAnimation->getJetzt() + 1 >= aAnimation->zAnimationData()->getBildAnzahl() )
  514. {
  515. rend |= aAnimation->tick( tickVal );
  516. if( aAnimation->getJetzt() + 1 < aAnimation->zAnimationData()->getBildAnzahl() )
  517. aAnimation->setSichtbar( 0 );
  518. }
  519. else
  520. rend |= aAnimation->tick( tickVal );
  521. }
  522. if( ausgewählt )
  523. {
  524. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  525. if( a != 150 )
  526. {
  527. if( a + val > 150 )
  528. a = 150;
  529. else
  530. a += val;
  531. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  532. rend = 1;
  533. }
  534. }
  535. else
  536. {
  537. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  538. if( a != 0 )
  539. {
  540. if( a - val < 0 )
  541. a = 0;
  542. else
  543. a -= val;
  544. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  545. rend = 1;
  546. }
  547. }
  548. if( ( animation | 0x1 ) == animation ) // sichtbar
  549. {
  550. if( tAlpha != 255 )
  551. {
  552. if( tAlpha + val > 255 )
  553. tAlpha = 255;
  554. else
  555. tAlpha += val;
  556. rend = 1;
  557. }
  558. }
  559. else // unsichtbar
  560. {
  561. if( tAlpha != 0 )
  562. {
  563. if( tAlpha - val < 0 )
  564. tAlpha = 0;
  565. else
  566. tAlpha -= val;
  567. rend = 1;
  568. }
  569. }
  570. if( geladen == 2 )
  571. {
  572. if( ( animation | 0x4 ) == animation ) // auswählen
  573. {
  574. if( beschreibung )
  575. {
  576. if( alpha != 255 )
  577. {
  578. if( alpha + val < 255 )
  579. alpha += val;
  580. else
  581. alpha = 255;
  582. rend = 1;
  583. }
  584. }
  585. }
  586. else // abwählen
  587. {
  588. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  589. if( a != 0 )
  590. {
  591. a -= val;
  592. if( a < 0 )
  593. a = 0;
  594. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  595. rend = 1;
  596. }
  597. if( beschreibung )
  598. {
  599. if( alpha != 0 )
  600. {
  601. if( alpha - val > 0 )
  602. alpha -= val;
  603. else
  604. alpha = 0;
  605. rend = 1;
  606. }
  607. }
  608. }
  609. }
  610. bool ret = rend;
  611. rend = 0;
  612. return ret;
  613. }
  614. void SpielDaten::doMausEreignis( MausEreignis &me )
  615. {
  616. if( !erlaubt && ausgewählt )
  617. {
  618. me.mx -= gr.x + 90;
  619. me.my -= 350;
  620. updateH->doMausEreignis( spielId, me );
  621. me.my += 350;
  622. me.mx += 90;
  623. if( beschreibung )
  624. beschreibung->doMausEreignis( me );
  625. me.mx += gr.x;
  626. }
  627. }
  628. void SpielDaten::render( Bild &zRObj )
  629. {
  630. int x = pos.x;
  631. int y = pos.y;
  632. int br = gr.x;
  633. int hö = gr.y;
  634. if( !zRObj.setDrawOptions( x, y, br, hö ) )
  635. return;
  636. zRObj.setAlpha( tAlpha );
  637. rahmen->setSize( br, hö );
  638. int rbr = rahmen->getRBreite();
  639. if( geladen && hintergrund && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
  640. zRObj.drawBild( rbr, rbr, br - rbr * 2, hö - rbr * 2, *hintergrund );
  641. if( aAnimation )
  642. aAnimation->render( zRObj );
  643. rahmen->render( zRObj );
  644. if( auswahl && ( ( auswahl->getFarbe() >> 24 ) & 0xFF ) && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
  645. {
  646. auswahl->setPosition( rbr, rbr );
  647. auswahl->setSize( br - rbr * 2, hö - rbr * 2 );
  648. auswahl->render( zRObj );
  649. }
  650. zRObj.releaseDrawOptions();
  651. x = br;
  652. y = 0;
  653. br = 580;
  654. hö = 480;
  655. if( !zRObj.setDrawOptions( x, y, br, hö ) )
  656. {
  657. zRObj.releaseAlpha();
  658. return;
  659. }
  660. if( geladen == 2 && beschreibung )
  661. {
  662. zRObj.setAlpha( alpha );
  663. beschreibung->render( zRObj );
  664. zRObj.releaseAlpha();
  665. }
  666. if( !erlaubt )
  667. updateH->render( spielId, 90, 350, zRObj );
  668. if( ausgewählt && geladen != 2 && ladeAnimation->zAnimationData() )
  669. {
  670. ladenBild++;
  671. if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
  672. ladenBild = 0;
  673. zRObj.drawBild( 275, 195, 50, 50, *ladeAnimation->zAnimationData()->zBild( ladenBild ) );
  674. rend = 1;
  675. }
  676. zRObj.releaseDrawOptions();
  677. zRObj.releaseAlpha();
  678. }
  679. // constant
  680. int SpielDaten::getSpielId() const
  681. {
  682. return spielId;
  683. }
  684. bool SpielDaten::istausgewählt() const
  685. {
  686. return ausgewählt;
  687. }
  688. Text *SpielDaten::zName() const
  689. {
  690. return name;
  691. }
  692. bool SpielDaten::istErlaubt() const
  693. {
  694. return erlaubt;
  695. }
  696. // Reference Counting
  697. SpielDaten *SpielDaten::getThis()
  698. {
  699. ref++;
  700. return this;
  701. }
  702. SpielDaten *SpielDaten::release()
  703. {
  704. ref--;
  705. if( !ref )
  706. delete this;
  707. return 0;
  708. }
  709. // Inhalt der SpielAuswahl Klasse aus SpielAuswahl.h
  710. // Konstruktor
  711. SpielAuswahlFenster::SpielAuswahlFenster( Schrift *zSchrift )
  712. : Thread()
  713. {
  714. schrift = zSchrift->getThis();
  715. rahmen = new LRahmen();
  716. rahmen->setFarbe( 0xFFFFFFFF );
  717. rahmen->setRamenBreite( 1 );
  718. rahmen->setSize( 760, 500 );
  719. members = new RCArray< SpielDaten >();
  720. anzahl = 0;
  721. animation = 0;
  722. auswahl = -1;
  723. tickVal = 0;
  724. seite = 0;
  725. pos = Punkt( 10, 10 );
  726. gr = Punkt( 780, 430 );
  727. rend = 0;
  728. ref = 1;
  729. alpha = 0;
  730. start();
  731. }
  732. // Destruktor
  733. SpielAuswahlFenster::~SpielAuswahlFenster()
  734. {
  735. if( run )
  736. {
  737. warteAufThread( 5000 );
  738. ende();
  739. }
  740. if( schrift )
  741. schrift->release();
  742. if( rahmen )
  743. rahmen->release();
  744. if( members )
  745. members->release();
  746. }
  747. // nicht constant
  748. void SpielAuswahlFenster::setSichtbar( bool sichtbar )
  749. {
  750. if( sichtbar )
  751. {
  752. animation |= 0x1;
  753. start();
  754. }
  755. else
  756. {
  757. auswahl = -1;
  758. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  759. members->z( i )->setSichtbar( 0 );
  760. animation &= ~0x1;
  761. }
  762. rend = 1;
  763. }
  764. void SpielAuswahlFenster::blättern( bool oben )
  765. {
  766. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  767. members->z( i )->setSichtbar( 0 );
  768. seite += oben ? 1 : -1;
  769. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  770. {
  771. members->z( i )->setPosition( i % 4 );
  772. members->z( i )->setSichtbar( 1 );
  773. }
  774. auswahl = -1;
  775. rend = 1;
  776. }
  777. void SpielAuswahlFenster::updateListe()
  778. {
  779. if( run )
  780. return;
  781. start();
  782. }
  783. void SpielAuswahlFenster::thread()
  784. {
  785. Array< int > *liste = infoClient->getAccountSpielArtListe();
  786. if( !liste )
  787. {
  788. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( infoClient->getLetzterFehler() ),
  789. new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
  790. run = 0;
  791. return;
  792. }
  793. int anz = liste->getEintragAnzahl();
  794. for( int i = 0; i < anz; i++ )
  795. {
  796. Text *name = infoClient->getSpielName( liste->hat( i ) ? liste->get( i ) : 0 );
  797. if( name )
  798. {
  799. bool gefunden = 0;
  800. for( int j = 0; j < anzahl; j++ )
  801. {
  802. SpielDaten *tmp = members->z( j );
  803. if( liste->hat( i ) && tmp->getSpielId() == liste->get( i ) )
  804. {
  805. gefunden = 1;
  806. break;
  807. }
  808. }
  809. if( !gefunden )
  810. {
  811. SpielDaten *tmp = new SpielDaten( schrift, name->getText(), liste->hat( i ) ? liste->get( i ) : 0 );
  812. members->add( tmp, anzahl );
  813. anzahl++;
  814. }
  815. name->release();
  816. }
  817. }
  818. if( liste )
  819. liste->release();
  820. for( int i = 0; i < anzahl; i++ )
  821. members->z( i )->updateErlaubt();
  822. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  823. {
  824. members->z( i )->setPosition( i % 4 );
  825. members->z( i )->setSichtbar();
  826. }
  827. rend = 1;
  828. run = 0;
  829. }
  830. bool SpielAuswahlFenster::tick( double tickVal )
  831. {
  832. for( int i = 0; i < anzahl; i++ )
  833. rend |= members->z( i )->tick( tickVal );
  834. this->tickVal += tickVal * 750;
  835. int val = ( int )this->tickVal;
  836. if( val < 1 )
  837. {
  838. bool ret = rend;
  839. rend = 0;
  840. return ret;
  841. }
  842. if( val > 25 )
  843. val = 25;
  844. this->tickVal -= val;
  845. if( ( animation | 0x1 ) == animation ) // sichtbar
  846. {
  847. if( alpha < 255 )
  848. {
  849. if( alpha + val >= 255 )
  850. {
  851. alpha = 255;
  852. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  853. {
  854. members->z( i )->setPosition( i % 4 );
  855. members->z( i )->setSichtbar( 1 );
  856. }
  857. }
  858. else
  859. alpha += val;
  860. rend = 1;
  861. }
  862. }
  863. else // unsichtbar
  864. {
  865. if( alpha > 0 )
  866. {
  867. if( alpha - val < 0 )
  868. alpha = 0;
  869. else
  870. alpha -= val;
  871. rend = 1;
  872. }
  873. }
  874. bool ret = rend;
  875. rend = 0;
  876. return ret;
  877. }
  878. void SpielAuswahlFenster::doMausEreignis( MausEreignis &me )
  879. {
  880. if( pos.x != 10 )
  881. return;
  882. me.mx -= pos.x;
  883. me.my -= pos.y;
  884. for( int i = 0; i < anzahl; i++ )
  885. members->z( i )->doMausEreignis( me );
  886. if( me.mx < 0 || me.my < 0 )
  887. {
  888. me.mx += pos.x;
  889. me.my += pos.y;
  890. return;
  891. }
  892. if( me.mx > 200 || me.my > getAnzahlAufSeite() * 100 )
  893. {
  894. me.mx += pos.x;
  895. me.my += pos.y;
  896. return;
  897. }
  898. if( me.id == ME_RLinks )
  899. {
  900. int treffer = me.my / 100 + seite * 4;
  901. if( treffer >= anzahl )
  902. {
  903. me.mx += pos.x;
  904. me.my += pos.y;
  905. return;
  906. }
  907. if( treffer == auswahl )
  908. {
  909. me.mx += pos.x;
  910. me.my += pos.y;
  911. return;
  912. }
  913. if( auswahl >= 0 )
  914. members->z( auswahl )->setAuswahl( 0 );
  915. members->z( treffer )->setAuswahl( 1 );
  916. auswahl = treffer;
  917. rend = 1;
  918. }
  919. me.mx += pos.x;
  920. me.my += pos.y;
  921. }
  922. void SpielAuswahlFenster::render( Bild &zrObj )
  923. {
  924. int x = pos.x;
  925. int y = pos.y;
  926. int br = gr.x;
  927. int hö = gr.y;
  928. if( !zrObj.setDrawOptions( x, y, br, hö ) )
  929. return;
  930. zrObj.setAlpha( alpha );
  931. rahmen->setSize( br, hö );
  932. rahmen->render( zrObj );
  933. int rbr = rahmen->getRBreite();
  934. if( !zrObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
  935. {
  936. zrObj.releaseDrawOptions();
  937. zrObj.releaseAlpha();
  938. return;
  939. }
  940. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  941. members->z( i )->render( zrObj );
  942. zrObj.releaseDrawOptions();
  943. if( !anzahl )
  944. {
  945. Text t = "Dieser Account besitzt momentan noch keine Spiele.\nBesuche den Shop um neue Spiele zu erwerben!";
  946. schrift->lock();
  947. schrift->setDrawPosition( 10, 10 );
  948. schrift->setSchriftSize( 12 );
  949. schrift->renderText( &t, zrObj, 0xFFFFFFFF );
  950. schrift->unlock();
  951. }
  952. zrObj.releaseDrawOptions();
  953. zrObj.releaseAlpha();
  954. }
  955. // constant
  956. int SpielAuswahlFenster::getAnzahl() const
  957. {
  958. return anzahl;
  959. }
  960. int SpielAuswahlFenster::getSeiteAnzahl() const
  961. {
  962. return ( anzahl / 4.0 == anzahl / 4 ) ? ( anzahl / 4 ) : ( anzahl / 4 + 1 );
  963. }
  964. int SpielAuswahlFenster::getSeite() const
  965. {
  966. return seite;
  967. }
  968. int SpielAuswahlFenster::getAnzahlAufSeite() const
  969. {
  970. return ( anzahl < seite * 4 + 4 ) ? ( anzahl - seite * 4 ) : 4;
  971. }
  972. bool SpielAuswahlFenster::hatAuswahl() const
  973. {
  974. return auswahl != -1;
  975. }
  976. SpielDaten *SpielAuswahlFenster::getAuswahl() const
  977. {
  978. return members->get( auswahl );
  979. }
  980. SpielDaten *SpielAuswahlFenster::zAuswahl() const
  981. {
  982. return members->z( auswahl );
  983. }
  984. bool SpielAuswahlFenster::istAuswahlErlubt() const
  985. {
  986. return auswahl != -1 && members->z( auswahl )->istErlaubt();
  987. }
  988. // Reference Counting
  989. SpielAuswahlFenster *SpielAuswahlFenster::getThis()
  990. {
  991. ref++;
  992. return this;
  993. }
  994. SpielAuswahlFenster *SpielAuswahlFenster::release()
  995. {
  996. ref--;
  997. if( !ref )
  998. delete this;
  999. return 0;
  1000. }