SpielAuswahl.cpp 29 KB

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