SpielAuswahl.cpp 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019
  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. #include <Globals.h>
  14. void SpielAuswahlKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
  15. {
  16. if( !p )
  17. return;
  18. ( (SpielDaten *)p )->ksgsAktion( parameter, retVal );
  19. }
  20. SpielDaten::Loader::Loader( SpielDaten * sd, int aktion )
  21. {
  22. this->sd = sd;
  23. this->aktion = aktion;
  24. beenden = 0;
  25. ref = 2;
  26. start();
  27. }
  28. void SpielDaten::Loader::setBeenden()
  29. {
  30. beenden = 1;
  31. }
  32. void SpielDaten::Loader::thread()
  33. {
  34. Text *pfad = new Text( "data/spiele/" );
  35. pfad->append( sd->name->getText() );
  36. pfad->append( "/data/game.ini" );
  37. if( !DateiExistiert( pfad->getThis() ) )
  38. {
  39. if( !aktion )
  40. {
  41. if( sd->aAnimation )
  42. sd->aAnimation->setSichtbar( 0 );
  43. sd->geladen = 0;
  44. sd->ausgewählt = 0;
  45. hauptScreen->lock();
  46. if( sd->aAnimation )
  47. sd->aAnimation = (Animation2D *)sd->aAnimation->release();
  48. hauptScreen->unlock();
  49. if( sd->hintergrund )
  50. sd->hintergrund = sd->hintergrund->release();
  51. if( sd->beschreibung )
  52. {
  53. sd->beschreibung->zurücksetzen();
  54. sd->beschreibung = dynamic_cast<KSGScriptObj *>( sd->beschreibung->release() );
  55. }
  56. if( sd->ksgs )
  57. {
  58. Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
  59. sd->ksgs = 0;
  60. }
  61. }
  62. else
  63. {
  64. if( !sd->hintergrund )
  65. sd->hintergrund = new Bild();
  66. sd->hintergrund->neuBild( 200, 100, 0xFF000000 );
  67. sd->tr->setSchriftSize( 12 );
  68. sd->tr->renderText( 10, 10, sd->name->getText(), *sd->hintergrund, 0xFFFFFFFF );
  69. if( !sd->geladen )
  70. sd->geladen = 1;
  71. sd->rend = 1;
  72. int dgId = infoClient->getDateiGruppeIdVonSpiel( sd->spielId );
  73. if( dgId )
  74. {
  75. KSGTDatei *dg = new KSGTDatei( "data/dg.ksgt" );
  76. dg->laden();
  77. bool gefunden = 0;
  78. for( int i = 0; i < dg->getZeilenAnzahl(); i++ )
  79. {
  80. if( dg->zFeld( i, 0 ) && TextZuInt( dg->zFeld( i, 0 )->getText(), 10 ) == dgId )
  81. {
  82. gefunden = 1;
  83. break;
  84. }
  85. }
  86. if( !gefunden )
  87. {
  88. for( int i = 0; i < dg->getZeilenAnzahl(); i++ )
  89. {
  90. if( dg->zFeld( i, 3 ) && !dg->zFeld( i, 3 )->istGleich( "SOFORT" ) && !dg->zFeld( i, 3 )->istGleich( "NICHT" ) )
  91. {
  92. int platz = TextZuInt( dg->zFeld( i, 3 )->getText(), 10 ) + 1;
  93. Text *plT = new Text();
  94. plT->append( platz );
  95. dg->zFeld( i, 3 )->setText( plT );
  96. }
  97. }
  98. Text *idT = new Text();
  99. idT->append( dgId );
  100. Text *pfad = infoClient->getDateiGruppePfad( dgId );
  101. if( pfad )
  102. {
  103. RCArray< Text > *zeile = new RCArray< Text >();
  104. zeile->add( idT );
  105. zeile->add( pfad );
  106. zeile->add( new Text( "0" ) );
  107. zeile->add( new Text( "0" ) );
  108. dg->addZeile( 4, zeile );
  109. zeile->release();
  110. }
  111. else
  112. idT->release();
  113. }
  114. dg->speichern();
  115. dg->release();
  116. }
  117. if( aktion == 2 && !beenden )
  118. {
  119. if( sd->beschreibung )
  120. {
  121. sd->beschreibung->zurücksetzen();
  122. sd->beschreibung = dynamic_cast<KSGScriptObj*>(sd->beschreibung->release());
  123. }
  124. if( !sd->ksgs )
  125. sd->ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
  126. if( sd->ksgs )
  127. {
  128. KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( sd->ksgs, KSGS_START_FUNKTION );
  129. if( getKSGScript )
  130. {
  131. sd->beschreibung = getKSGScript();
  132. sd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
  133. sd->beschreibung->setSchriftZ( sd->schrift->getThis() );
  134. sd->beschreibung->setSize( 578, 428 );
  135. sd->beschreibung->setRückrufParam( sd );
  136. sd->beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
  137. sd->beschreibung->setScriptDatei( "data/script/SpielNichtAktuell.ksgs" );
  138. }
  139. else
  140. {
  141. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  142. new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
  143. "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
  144. new Text( "Ok" ), 0 );
  145. }
  146. }
  147. else
  148. {
  149. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  150. new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
  151. new Text( "Ok" ), 0 );
  152. }
  153. if( sd->beschreibung )
  154. sd->geladen = 2;
  155. if( sd->beschreibung &&sd->ksgs &&sd->ausgewählt )
  156. sd->beschreibung->neuLaden();
  157. }
  158. }
  159. pfad->release();
  160. sd->rend = 1;
  161. return;
  162. }
  163. Datei *ini = new Datei();
  164. ini->setDatei( pfad->getText() );
  165. ini->open( Datei::Style::lesen );
  166. if( !aktion )
  167. {
  168. if( sd->aAnimation )
  169. sd->aAnimation->setSichtbar( 0 );
  170. sd->geladen = 0;
  171. sd->ausgewählt = 0;
  172. hauptScreen->lock();
  173. if( sd->aAnimation )
  174. sd->aAnimation = (Animation2D *)sd->aAnimation->release();
  175. hauptScreen->unlock();
  176. if( sd->hintergrund )
  177. sd->hintergrund = sd->hintergrund->release();
  178. if( sd->beschreibung )
  179. {
  180. sd->beschreibung->zurücksetzen();
  181. sd->beschreibung = dynamic_cast<KSGScriptObj*>(sd->beschreibung->release());
  182. }
  183. if( sd->ksgs )
  184. {
  185. Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
  186. sd->ksgs = 0;
  187. }
  188. sd->rend = 1;
  189. }
  190. else
  191. {
  192. Text *pf = ini->leseZeile();
  193. pf->remove( pf->getLength() - 1 );
  194. pf->insert( 0, "/bilder/" );
  195. pf->insert( 0, sd->name->getText() );
  196. pf->insert( 0, "data/spiele/" );
  197. if( pf->hat( ".ltdb/" ) )
  198. {
  199. if( !sd->hintergrund )
  200. {
  201. LTDBDatei *bildDatei = new LTDBDatei();
  202. bildDatei->setDatei( pf->getTeilText( 0, pf->positionVon( ".ltdb" ) + 5 ) );
  203. bildDatei->leseDaten( 0 );
  204. sd->hintergrund = bildDatei->laden( 0, pf->getTeilText( pf->positionVon( ".ltdb" ) + 6 ) );
  205. bildDatei->release();
  206. }
  207. }
  208. else
  209. {
  210. if( !sd->hintergrund )
  211. {
  212. LTDBDatei *bildDatei = new LTDBDatei();
  213. bildDatei->setDatei( pf->getThis() );
  214. bildDatei->leseDaten( 0 );
  215. sd->hintergrund = bildDatei->laden( 0, bildDatei->zBildListe()->get( 0 ) );
  216. bildDatei->release();
  217. }
  218. }
  219. pf->release();
  220. pf = ini->leseZeile();
  221. pf->release();
  222. pf = ini->leseZeile();
  223. pf->remove( pf->getLength() - 1 );
  224. pf->insert( 0, "/data/" );
  225. pf->insert( 0, sd->name->getText() );
  226. pf->insert( 0, "data/spiele/" );
  227. Datei * idDatei = new Datei();
  228. idDatei->setDatei( pf->getText() );
  229. idDatei->open( Datei::Style::lesen );
  230. idDatei->lese( (char *)& sd->spielId, 4 );
  231. idDatei->close();
  232. idDatei->release();
  233. pf->release();
  234. if( !sd->geladen )
  235. sd->geladen = 1;
  236. sd->rend = 1;
  237. ini->setLPosition( 0, 0 );
  238. if( aktion == 2 && !beenden )
  239. {
  240. pf = ini->leseZeile();
  241. pf->remove( pf->getLength() - 1 );
  242. pf->insert( 0, "/bilder/" );
  243. pf->insert( 0, sd->name->getText() );
  244. pf->insert( 0, "data/spiele/" );
  245. if( !pf->hat( ".ltdb/" ) )
  246. {
  247. LTDBDatei *add = new LTDBDatei();
  248. add->setDatei( pf->getThis() );
  249. add->leseDaten( 0 );
  250. Animation2DData *ad = new Animation2DData();
  251. ad->ladeAnimation( add );
  252. ad->setWiederhohlend( 1 );
  253. ad->setFPS( 30 );
  254. hauptScreen->lock();
  255. if( sd->aAnimation )
  256. sd->aAnimation = (Animation2D *)sd->aAnimation->release();
  257. sd->aAnimation = new Animation2D();
  258. hauptScreen->unlock();
  259. sd->aAnimation->setSize( 200, 100 );
  260. sd->aAnimation->setPosition( 0, 0 );
  261. sd->aAnimation->setAnimationDataZ( ad );
  262. }
  263. pf->release();
  264. pf = ini->leseZeile();
  265. pf->remove( pf->getLength() - 1 );
  266. pf->insert( 0, "/data/" );
  267. pf->insert( 0, sd->name->getText() );
  268. pf->insert( 0, "data/spiele/" );
  269. if( sd->beschreibung )
  270. {
  271. sd->beschreibung->zurücksetzen();
  272. sd->beschreibung = dynamic_cast<KSGScriptObj*>(sd->beschreibung->release());
  273. }
  274. if( !sd->ksgs )
  275. sd->ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
  276. if( sd->ksgs )
  277. {
  278. KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( sd->ksgs, KSGS_START_FUNKTION );
  279. if( getKSGScript )
  280. {
  281. sd->beschreibung = getKSGScript();
  282. sd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
  283. sd->beschreibung->setSchriftZ( sd->schrift->getThis() );
  284. sd->beschreibung->setSize( 578, 428 );
  285. sd->beschreibung->setRückrufParam( sd );
  286. sd->beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
  287. sd->beschreibung->setScriptDatei( pf->getText() );
  288. }
  289. else
  290. {
  291. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  292. new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
  293. "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
  294. new Text( "Ok" ), 0 );
  295. }
  296. }
  297. else
  298. {
  299. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  300. new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
  301. new Text( "Ok" ), 0 );
  302. }
  303. pf->release();
  304. if( sd->beschreibung )
  305. sd->geladen = 2;
  306. if( sd->beschreibung &&sd->ksgs &&sd->ausgewählt )
  307. sd->beschreibung->neuLaden();
  308. sd->rend = 1;
  309. }
  310. }
  311. pfad->release();
  312. ini->close();
  313. ini->release();
  314. if( !sd->erlaubt )
  315. sd->updateErlaubt();
  316. sd->rend = 1;
  317. release();
  318. }
  319. SpielDaten::Loader *SpielDaten::Loader::release()
  320. {
  321. if( !--ref )
  322. delete this;
  323. return 0;
  324. }
  325. int SpielDaten::Loader::getAktion() const
  326. {
  327. return aktion;
  328. }
  329. // Inhalt der SpielDaten Klasse aus SpielAuswahl.h
  330. // Konstruktor
  331. SpielDaten::SpielDaten( Schrift * zSchrift, const char *name, int id )
  332. {
  333. this->name = new Text( name );
  334. hintergrund = 0;
  335. aAnimation = 0;
  336. beschreibung = 0;
  337. ksgs = 0;
  338. rahmen = new LRahmen();
  339. rahmen->setFarbe( 0xFFFFFFFF );
  340. rahmen->setRamenBreite( 1 );
  341. tickVal = 0;
  342. animation = 0;
  343. ausgewählt = 0;
  344. pos = Punkt( 0, 500 );
  345. gr = Punkt( 200, 100 );
  346. schrift = zSchrift->getThis();
  347. tr = new TextRenderer( schrift->getThis() );
  348. spielId = id;
  349. geladen = 0;
  350. erlaubt = 0;
  351. auswahl = new AlphaFeld();
  352. auswahl->setFarbe( 0x0000FF00 );
  353. auswahl->setStrength( 8 );
  354. auswahl->setSize( 200, 100 );
  355. ladenBild = 0;
  356. rend = 0;
  357. ref = 1;
  358. alpha = 0;
  359. tAlpha = 0;
  360. loader = new Loader( this, 1 );
  361. }
  362. // Destruktor
  363. SpielDaten::~SpielDaten()
  364. {
  365. if( loader &&loader->isRunning() )
  366. loader->warteAufThread( INT_MAX );
  367. loader->release();
  368. if( schrift )
  369. schrift->release();
  370. name->release();
  371. if( hintergrund )
  372. hintergrund->release();
  373. if( aAnimation )
  374. aAnimation->release();
  375. if( beschreibung )
  376. {
  377. beschreibung->zurücksetzen();
  378. beschreibung->release();
  379. }
  380. if( ksgs )
  381. {
  382. Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
  383. ksgs = 0;
  384. }
  385. rahmen->release();
  386. auswahl->release();
  387. tr->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. tr = new TextRenderer( schrift->getThis() );
  704. rahmen = new LRahmen();
  705. rahmen->setFarbe( 0xFFFFFFFF );
  706. rahmen->setRamenBreite( 1 );
  707. rahmen->setSize( 760, 500 );
  708. members = new RCArray< SpielDaten >();
  709. anzahl = 0;
  710. animation = 0;
  711. auswahl = -1;
  712. tickVal = 0;
  713. seite = 0;
  714. pos = Punkt( 10, 10 );
  715. gr = Punkt( 780, 430 );
  716. rend = 0;
  717. alpha = 0;
  718. start();
  719. }
  720. // Destruktor
  721. SpielAuswahlFenster::~SpielAuswahlFenster()
  722. {
  723. if( schrift )
  724. schrift->release();
  725. if( rahmen )
  726. rahmen->release();
  727. if( members )
  728. members->release();
  729. tr->release();
  730. }
  731. // nicht constant
  732. void SpielAuswahlFenster::setSichtbar( bool sichtbar )
  733. {
  734. if( sichtbar )
  735. {
  736. animation |= 0x1;
  737. start();
  738. }
  739. else
  740. {
  741. auswahl = -1;
  742. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  743. members->z( i )->setSichtbar( 0 );
  744. animation &= ~0x1;
  745. }
  746. rend = 1;
  747. }
  748. void SpielAuswahlFenster::blättern( bool oben )
  749. {
  750. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  751. members->z( i )->setSichtbar( 0 );
  752. seite += oben ? 1 : -1;
  753. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  754. {
  755. members->z( i )->setPosition( i % 4 );
  756. members->z( i )->setSichtbar( 1 );
  757. }
  758. auswahl = -1;
  759. rend = 1;
  760. }
  761. void SpielAuswahlFenster::updateListe()
  762. {
  763. if( run )
  764. return;
  765. start();
  766. }
  767. void SpielAuswahlFenster::thread()
  768. {
  769. Array< int > *liste = infoClient->getAccountSpielArtListe();
  770. if( !liste )
  771. {
  772. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( infoClient->getLetzterFehler() ),
  773. new Text( "Ok" ), 0 );
  774. run = 0;
  775. return;
  776. }
  777. int anz = liste->getEintragAnzahl();
  778. for( int i = 0; i < anz; i++ )
  779. {
  780. Text *name = infoClient->getSpielName( liste->hat( i ) ? liste->get( i ) : 0 );
  781. if( name )
  782. {
  783. bool gefunden = 0;
  784. for( int j = 0; j < anzahl; j++ )
  785. {
  786. SpielDaten *tmp = members->z( j );
  787. if( liste->hat( i ) && tmp->getSpielId() == liste->get( i ) )
  788. {
  789. gefunden = 1;
  790. break;
  791. }
  792. }
  793. if( !gefunden )
  794. {
  795. SpielDaten *tmp = new SpielDaten( schrift, name->getText(), liste->hat( i ) ? liste->get( i ) : 0 );
  796. members->add( tmp, anzahl );
  797. anzahl++;
  798. }
  799. name->release();
  800. }
  801. }
  802. if( liste )
  803. liste->release();
  804. for( int i = 0; i < anzahl; i++ )
  805. members->z( i )->updateErlaubt();
  806. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  807. {
  808. members->z( i )->setPosition( i % 4 );
  809. members->z( i )->setSichtbar();
  810. }
  811. rend = 1;
  812. run = 0;
  813. }
  814. bool SpielAuswahlFenster::tick( double tickVal )
  815. {
  816. for( int i = 0; i < anzahl; i++ )
  817. rend |= members->z( i )->tick( tickVal );
  818. this->tickVal += tickVal * 750;
  819. int val = (int)this->tickVal;
  820. if( val < 1 )
  821. {
  822. bool ret = rend;
  823. rend = 0;
  824. return ret;
  825. }
  826. if( val > 25 )
  827. val = 25;
  828. this->tickVal -= val;
  829. if( ( animation | 0x1 ) == animation ) // sichtbar
  830. {
  831. if( alpha < 255 )
  832. {
  833. if( alpha + val >= 255 )
  834. {
  835. alpha = 255;
  836. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  837. {
  838. members->z( i )->setPosition( i % 4 );
  839. members->z( i )->setSichtbar( 1 );
  840. }
  841. }
  842. else
  843. alpha += val;
  844. rend = 1;
  845. }
  846. }
  847. else // unsichtbar
  848. {
  849. if( alpha > 0 )
  850. {
  851. if( alpha - val < 0 )
  852. alpha = 0;
  853. else
  854. alpha -= val;
  855. rend = 1;
  856. }
  857. }
  858. bool ret = rend;
  859. rend = 0;
  860. return ret;
  861. }
  862. void SpielAuswahlFenster::doMausEreignis( MausEreignis & me )
  863. {
  864. if( pos.x != 10 )
  865. return;
  866. me.mx -= pos.x;
  867. me.my -= pos.y;
  868. for( int i = 0; i < anzahl; i++ )
  869. members->z( i )->doMausEreignis( me );
  870. if( me.mx < 0 || me.my < 0 )
  871. {
  872. me.mx += pos.x;
  873. me.my += pos.y;
  874. return;
  875. }
  876. if( me.mx > 200 || me.my > getAnzahlAufSeite() * 100 )
  877. {
  878. me.mx += pos.x;
  879. me.my += pos.y;
  880. return;
  881. }
  882. if( me.id == ME_RLinks )
  883. {
  884. int treffer = me.my / 100 + seite * 4;
  885. if( treffer >= anzahl )
  886. {
  887. me.mx += pos.x;
  888. me.my += pos.y;
  889. return;
  890. }
  891. if( treffer == auswahl )
  892. {
  893. me.mx += pos.x;
  894. me.my += pos.y;
  895. return;
  896. }
  897. if( auswahl >= 0 )
  898. members->z( auswahl )->setAuswahl( 0 );
  899. members->z( treffer )->setAuswahl( 1 );
  900. auswahl = treffer;
  901. rend = 1;
  902. }
  903. me.mx += pos.x;
  904. me.my += pos.y;
  905. }
  906. void SpielAuswahlFenster::render( Bild & zrObj )
  907. {
  908. int x = pos.x;
  909. int y = pos.y;
  910. int br = gr.x;
  911. int hö = gr.y;
  912. if( !zrObj.setDrawOptions( x, y, br, hö ) )
  913. return;
  914. zrObj.setAlpha( alpha );
  915. rahmen->setSize( br, hö );
  916. rahmen->render( zrObj );
  917. int rbr = rahmen->getRBreite();
  918. if( !zrObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
  919. {
  920. zrObj.releaseDrawOptions();
  921. zrObj.releaseAlpha();
  922. return;
  923. }
  924. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  925. members->z( i )->render( zrObj );
  926. zrObj.releaseDrawOptions();
  927. if( !anzahl )
  928. {
  929. Text t = "Dieser Account besitzt momentan noch keine Spiele.\nBesuche den Shop um neue Spiele zu erwerben!";
  930. tr->setSchriftSize( 12 );
  931. tr->renderText( 10, 10, t, zrObj, 0xFFFFFFFF );
  932. }
  933. zrObj.releaseDrawOptions();
  934. zrObj.releaseAlpha();
  935. }
  936. // constant
  937. int SpielAuswahlFenster::getAnzahl() const
  938. {
  939. return anzahl;
  940. }
  941. int SpielAuswahlFenster::getSeiteAnzahl() const
  942. {
  943. return ( anzahl / 4.0 == anzahl / 4 ) ? ( anzahl / 4 ) : ( anzahl / 4 + 1 );
  944. }
  945. int SpielAuswahlFenster::getSeite() const
  946. {
  947. return seite;
  948. }
  949. int SpielAuswahlFenster::getAnzahlAufSeite() const
  950. {
  951. return ( anzahl < seite * 4 + 4 ) ? ( anzahl - seite * 4 ) : 4;
  952. }
  953. bool SpielAuswahlFenster::hatAuswahl() const
  954. {
  955. return auswahl != -1;
  956. }
  957. SpielDaten *SpielAuswahlFenster::getAuswahl() const
  958. {
  959. return members->get( auswahl );
  960. }
  961. SpielDaten *SpielAuswahlFenster::zAuswahl() const
  962. {
  963. return members->z( auswahl );
  964. }
  965. bool SpielAuswahlFenster::istAuswahlErlubt() const
  966. {
  967. return auswahl != -1 && members->z( auswahl )->istErlaubt();
  968. }
  969. // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
  970. Thread *SpielAuswahlFenster::release()
  971. {
  972. if( ref == 2 && run )
  973. {
  974. warteAufThread( 5000 );
  975. ende();
  976. }
  977. return Thread::release();
  978. }