SpielAuswahl.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979
  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. : Thread()
  22. {
  23. this->sd = sd;
  24. this->aktion = aktion;
  25. beenden = 0;
  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->getText() ) )
  38. {
  39. if( !aktion )
  40. {
  41. if( sd->aAnimation )
  42. sd->aAnimation->setSichtbar( 0 );
  43. sd->geladen = 0;
  44. sd->ausgewählt = 0;
  45. uiFactory.initParam.bildschirm->lock();
  46. if( sd->aAnimation )
  47. sd->aAnimation = (Animation2D *)sd->aAnimation->release();
  48. uiFactory.initParam.bildschirm->unlock();
  49. if( sd->hintergrund )
  50. sd->hintergrund = (Bild *)sd->hintergrund->release();
  51. if( sd->beschreibung )
  52. {
  53. sd->beschreibung->reset();
  54. sd->beschreibung = (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->reset();
  122. sd->beschreibung = (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( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
  133. sd->beschreibung->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
  134. sd->beschreibung->setSize( 578, 428 );
  135. sd->beschreibung->setCallbackParam( sd );
  136. sd->beschreibung->setCallbackFunktion( 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. uiFactory.initParam.bildschirm->lock();
  173. if( sd->aAnimation )
  174. sd->aAnimation = (Animation2D *)sd->aAnimation->release();
  175. uiFactory.initParam.bildschirm->unlock();
  176. if( sd->hintergrund )
  177. sd->hintergrund = (Bild *)sd->hintergrund->release();
  178. if( sd->beschreibung )
  179. {
  180. sd->beschreibung->reset();
  181. sd->beschreibung = (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( dynamic_cast<Text *>( 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( dynamic_cast<Text *>( pf->getThis() ) );
  249. add->leseDaten( 0 );
  250. Animation2DData *ad = new Animation2DData();
  251. ad->ladeAnimation( add );
  252. ad->setWiederhohlend( 1 );
  253. ad->setFPS( 30 );
  254. uiFactory.initParam.bildschirm->lock();
  255. if( sd->aAnimation )
  256. sd->aAnimation = (Animation2D *)sd->aAnimation->release();
  257. sd->aAnimation = new Animation2D();
  258. uiFactory.initParam.bildschirm->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->reset();
  272. sd->beschreibung = (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( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
  283. sd->beschreibung->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
  284. sd->beschreibung->setSize( 578, 428 );
  285. sd->beschreibung->setCallbackParam( sd );
  286. sd->beschreibung->setCallbackFunktion( 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. }
  318. int SpielDaten::Loader::getAktion() const
  319. {
  320. return aktion;
  321. }
  322. // Inhalt der SpielDaten Klasse aus SpielAuswahl.h
  323. // Konstruktor
  324. SpielDaten::SpielDaten( const char *name, int id )
  325. : ReferenceCounter()
  326. {
  327. this->name = new Text( name );
  328. hintergrund = 0;
  329. aAnimation = 0;
  330. beschreibung = 0;
  331. ksgs = 0;
  332. rahmen = new LRahmen();
  333. rahmen->setFarbe( 0xFFFFFFFF );
  334. rahmen->setRamenBreite( 1 );
  335. tickVal = 0;
  336. animation = 0;
  337. ausgewählt = 0;
  338. pos = Punkt( 0, 500 );
  339. gr = Punkt( 200, 100 );
  340. tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
  341. spielId = id;
  342. geladen = 0;
  343. erlaubt = 0;
  344. auswahl = new AlphaFeld();
  345. auswahl->setFarbe( 0x0000FF00 );
  346. auswahl->setStrength( 8 );
  347. auswahl->setSize( 200, 100 );
  348. ladenBild = 0;
  349. rend = 0;
  350. alpha = 0;
  351. tAlpha = 0;
  352. loader = new Loader( this, 1 );
  353. }
  354. // Destruktor
  355. SpielDaten::~SpielDaten()
  356. {
  357. if( loader && loader->isRunning() )
  358. loader->warteAufThread( INT_MAX );
  359. loader->release();
  360. name->release();
  361. if( hintergrund )
  362. hintergrund->release();
  363. if( aAnimation )
  364. aAnimation->release();
  365. if( beschreibung )
  366. {
  367. beschreibung->reset();
  368. beschreibung->release();
  369. }
  370. if( ksgs )
  371. {
  372. Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
  373. ksgs = 0;
  374. }
  375. rahmen->release();
  376. auswahl->release();
  377. tr->release();
  378. }
  379. // nicht constant
  380. void SpielDaten::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
  381. {}
  382. void SpielDaten::setSichtbar( bool sichtbar )
  383. {
  384. if( sichtbar )
  385. animation |= 0x1;
  386. else
  387. {
  388. animation &= ~0x1;
  389. setAuswahl( 0 );
  390. auswahl->setFarbe( auswahl->getFarbe() & 0xFFFFFF );
  391. }
  392. uiFactory.initParam.bildschirm->lock();
  393. if( loader->getAktion() == ( sichtbar ? 2 : 0 ) )
  394. {
  395. uiFactory.initParam.bildschirm->unlock();
  396. rend = 1;
  397. return;
  398. }
  399. loader->setBeenden();
  400. Loader *altLoader = loader;
  401. loader = new Loader( this, sichtbar ? 2 : 0 );
  402. altLoader->release();
  403. uiFactory.initParam.bildschirm->unlock();
  404. rend = 1;
  405. }
  406. void SpielDaten::setSichtbar()
  407. {
  408. animation |= 1;
  409. if( ausgewählt && geladen == 2 )
  410. {
  411. animation |= 0x4;
  412. beschreibung->setPosition( beschreibung->getX(), 0 );
  413. }
  414. uiFactory.initParam.bildschirm->lock();
  415. if( geladen != 2 && loader->getAktion() != 2 )
  416. {
  417. Loader *altLoader = loader;
  418. loader = new Loader( this, 2 );
  419. altLoader->release();
  420. }
  421. uiFactory.initParam.bildschirm->unlock();
  422. rend = 1;
  423. }
  424. void SpielDaten::setAuswahl( bool auswahl )
  425. {
  426. if( ausgewählt == auswahl )
  427. return;
  428. ausgewählt = auswahl;
  429. if( auswahl )
  430. {
  431. if( aAnimation )
  432. aAnimation->setSichtbar( 1 );
  433. if( beschreibung && ksgs )
  434. beschreibung->neuLaden();
  435. animation |= 0x4;
  436. }
  437. else
  438. animation &= ~0x4;
  439. rend = 1;
  440. }
  441. void SpielDaten::updateErlaubt()
  442. {
  443. bool update = erlaubt;
  444. erlaubt = 0;
  445. KSGTDatei *dgt = new KSGTDatei( "data/dg.ksgt" );
  446. dgt->laden();
  447. bool ak = 0;
  448. int dgId = infoClient->getDateiGruppeIdVonSpiel( spielId );
  449. for( int i = 0; i < dgt->getZeilenAnzahl(); i++ )
  450. {
  451. if( dgt->zFeld( i, 0 ) && TextZuInt( dgt->zFeld( i, 0 )->getText(), 10 ) == dgId )
  452. {
  453. int lv = dgt->zFeld( i, 2 ) ? TextZuInt( dgt->zFeld( i, 2 )->getText(), 10 ) : 0;
  454. int ov = infoClient->getSpielVersion( spielId );
  455. if( lv == ov )
  456. ak = 1;
  457. break;
  458. }
  459. }
  460. dgt->release();
  461. erlaubt = ak && infoClient->istSpielErlaubt( spielId );
  462. if( !erlaubt && !ak && !updateH->hat( dgId ) )
  463. {
  464. Text msg = "Das Spiel '";
  465. msg += name->getText();
  466. msg += "' muss aktualisiert werden.";
  467. nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( new Text( "Update" ), dynamic_cast<Text *>( msg.getThis() ), dgId, []()
  468. {
  469. if( nachLogin && nachLogin->zSpielenFenster() )
  470. nachLogin->zSpielenFenster()->updateErlaubt();
  471. } ) );
  472. }
  473. }
  474. void SpielDaten::setPosition( int lPos )
  475. {
  476. pos.y = lPos * 100;
  477. rend = 1;
  478. }
  479. bool SpielDaten::tick( double tickVal )
  480. {
  481. if( beschreibung )
  482. rend |= beschreibung->tick( tickVal );
  483. this->tickVal += tickVal * 500;
  484. int val = (int)this->tickVal;
  485. if( val < 1 )
  486. {
  487. bool ret = rend;
  488. rend = 0;
  489. return ret;
  490. }
  491. if( val > 17 )
  492. val = 17;
  493. this->tickVal -= val;
  494. if( aAnimation && geladen == 2 && aAnimation->istSichtbar() )
  495. {
  496. if( aAnimation->getJetzt() + 1 >= aAnimation->zAnimationData()->getBildAnzahl() )
  497. {
  498. rend |= aAnimation->tick( tickVal );
  499. if( aAnimation->getJetzt() + 1 < aAnimation->zAnimationData()->getBildAnzahl() )
  500. aAnimation->setSichtbar( 0 );
  501. }
  502. else
  503. rend |= aAnimation->tick( tickVal );
  504. }
  505. if( ausgewählt )
  506. {
  507. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  508. if( a != 150 )
  509. {
  510. if( a + val > 150 )
  511. a = 150;
  512. else
  513. a += val;
  514. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  515. rend = 1;
  516. }
  517. }
  518. else
  519. {
  520. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  521. if( a != 0 )
  522. {
  523. if( a - val < 0 )
  524. a = 0;
  525. else
  526. a -= val;
  527. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  528. rend = 1;
  529. }
  530. }
  531. if( ( animation | 0x1 ) == animation ) // sichtbar
  532. {
  533. if( tAlpha != 255 )
  534. {
  535. if( tAlpha + val > 255 )
  536. tAlpha = 255;
  537. else
  538. tAlpha += val;
  539. rend = 1;
  540. }
  541. }
  542. else // unsichtbar
  543. {
  544. if( tAlpha != 0 )
  545. {
  546. if( tAlpha - val < 0 )
  547. tAlpha = 0;
  548. else
  549. tAlpha -= val;
  550. rend = 1;
  551. }
  552. }
  553. if( geladen == 2 )
  554. {
  555. if( ( animation | 0x4 ) == animation ) // auswählen
  556. {
  557. if( beschreibung )
  558. {
  559. if( alpha != 255 )
  560. {
  561. if( alpha + val < 255 )
  562. alpha += val;
  563. else
  564. alpha = 255;
  565. rend = 1;
  566. }
  567. }
  568. }
  569. else // abwählen
  570. {
  571. int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
  572. if( a != 0 )
  573. {
  574. a -= val;
  575. if( a < 0 )
  576. a = 0;
  577. auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
  578. rend = 1;
  579. }
  580. if( beschreibung )
  581. {
  582. if( alpha != 0 )
  583. {
  584. if( alpha - val > 0 )
  585. alpha -= val;
  586. else
  587. alpha = 0;
  588. rend = 1;
  589. }
  590. }
  591. }
  592. }
  593. bool ret = rend;
  594. rend = 0;
  595. return ret;
  596. }
  597. void SpielDaten::doPublicMausEreignis( MausEreignis &me )
  598. {
  599. if( !erlaubt && ausgewählt )
  600. {
  601. me.mx -= gr.x + 90;
  602. me.mx += 90;
  603. if( beschreibung )
  604. beschreibung->doPublicMausEreignis( me );
  605. me.mx += gr.x;
  606. }
  607. }
  608. void SpielDaten::render( Bild &zRObj )
  609. {
  610. int x = pos.x;
  611. int y = pos.y;
  612. int br = gr.x;
  613. int hö = gr.y;
  614. if( !zRObj.setDrawOptions( x, y, br, hö ) )
  615. return;
  616. zRObj.setAlpha( tAlpha );
  617. rahmen->setSize( br, hö );
  618. int rbr = rahmen->getRBreite();
  619. if( geladen && hintergrund && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
  620. zRObj.drawBild( rbr, rbr, br - rbr * 2, hö - rbr * 2, *hintergrund );
  621. if( aAnimation )
  622. aAnimation->render( zRObj );
  623. rahmen->render( zRObj );
  624. if( auswahl && ( ( auswahl->getFarbe() >> 24 ) & 0xFF ) && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
  625. {
  626. auswahl->setPosition( rbr, rbr );
  627. auswahl->setSize( br - rbr * 2, hö - rbr * 2 );
  628. auswahl->render( zRObj );
  629. }
  630. zRObj.releaseDrawOptions();
  631. x = br;
  632. y = 0;
  633. br = 580;
  634. hö = 480;
  635. if( !zRObj.setDrawOptions( x, y, br, hö ) )
  636. {
  637. zRObj.releaseAlpha();
  638. return;
  639. }
  640. if( geladen == 2 && beschreibung )
  641. {
  642. zRObj.setAlpha( alpha );
  643. beschreibung->render( zRObj );
  644. zRObj.releaseAlpha();
  645. }
  646. if( ausgewählt && geladen != 2 && ladeAnimation->zAnimationData() )
  647. {
  648. ladenBild++;
  649. if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
  650. ladenBild = 0;
  651. zRObj.drawBild( 275, 195, 50, 50, *ladeAnimation->zAnimationData()->zBild( ladenBild ) );
  652. rend = 1;
  653. }
  654. zRObj.releaseDrawOptions();
  655. zRObj.releaseAlpha();
  656. }
  657. // constant
  658. int SpielDaten::getSpielId() const
  659. {
  660. return spielId;
  661. }
  662. bool SpielDaten::istausgewählt() const
  663. {
  664. return ausgewählt;
  665. }
  666. Text *SpielDaten::zName() const
  667. {
  668. return name;
  669. }
  670. bool SpielDaten::istErlaubt() const
  671. {
  672. return erlaubt;
  673. }
  674. // Inhalt der SpielAuswahl Klasse aus SpielAuswahl.h
  675. // Konstruktor
  676. SpielAuswahlFenster::SpielAuswahlFenster()
  677. : Thread()
  678. {
  679. tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
  680. rahmen = new LRahmen();
  681. rahmen->setFarbe( 0xFFFFFFFF );
  682. rahmen->setRamenBreite( 1 );
  683. rahmen->setSize( 760, 500 );
  684. members = new RCArray< SpielDaten >();
  685. anzahl = 0;
  686. animation = 0;
  687. auswahl = -1;
  688. tickVal = 0;
  689. seite = 0;
  690. pos = Punkt( 10, 10 );
  691. gr = Punkt( 780, 430 );
  692. rend = 0;
  693. alpha = 0;
  694. start();
  695. }
  696. // Destruktor
  697. SpielAuswahlFenster::~SpielAuswahlFenster()
  698. {
  699. if( rahmen )
  700. rahmen->release();
  701. if( members )
  702. members->release();
  703. tr->release();
  704. }
  705. // nicht constant
  706. void SpielAuswahlFenster::setSichtbar( bool sichtbar )
  707. {
  708. if( sichtbar )
  709. {
  710. animation |= 0x1;
  711. start();
  712. }
  713. else
  714. {
  715. auswahl = -1;
  716. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  717. members->z( i )->setSichtbar( 0 );
  718. animation &= ~0x1;
  719. }
  720. rend = 1;
  721. }
  722. void SpielAuswahlFenster::blättern( bool oben )
  723. {
  724. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  725. members->z( i )->setSichtbar( 0 );
  726. seite += oben ? 1 : -1;
  727. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  728. {
  729. members->z( i )->setPosition( i % 4 );
  730. members->z( i )->setSichtbar( 1 );
  731. }
  732. auswahl = -1;
  733. rend = 1;
  734. }
  735. void SpielAuswahlFenster::updateListe()
  736. {
  737. if( run )
  738. return;
  739. start();
  740. }
  741. void SpielAuswahlFenster::thread()
  742. {
  743. Array< int > *liste = infoClient->getAccountSpielArtListe();
  744. if( !liste )
  745. {
  746. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( infoClient->getLetzterFehler() ),
  747. new Text( "Ok" ), 0 );
  748. run = 0;
  749. return;
  750. }
  751. int anz = liste->getEintragAnzahl();
  752. for( int i = 0; i < anz; i++ )
  753. {
  754. Text *name = infoClient->getSpielName( liste->hat( i ) ? liste->get( i ) : 0 );
  755. if( name )
  756. {
  757. bool gefunden = 0;
  758. for( int j = 0; j < anzahl; j++ )
  759. {
  760. SpielDaten *tmp = members->z( j );
  761. if( liste->hat( i ) && tmp->getSpielId() == liste->get( i ) )
  762. {
  763. gefunden = 1;
  764. break;
  765. }
  766. }
  767. if( !gefunden )
  768. {
  769. SpielDaten *tmp = new SpielDaten( name->getText(), liste->hat( i ) ? liste->get( i ) : 0 );
  770. members->add( tmp, anzahl );
  771. anzahl++;
  772. }
  773. name->release();
  774. }
  775. }
  776. if( liste )
  777. liste->release();
  778. for( int i = 0; i < anzahl; i++ )
  779. members->z( i )->updateErlaubt();
  780. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  781. {
  782. members->z( i )->setPosition( i % 4 );
  783. members->z( i )->setSichtbar();
  784. }
  785. rend = 1;
  786. run = 0;
  787. }
  788. bool SpielAuswahlFenster::tick( double tickVal )
  789. {
  790. for( int i = 0; i < anzahl; i++ )
  791. rend |= members->z( i )->tick( tickVal );
  792. this->tickVal += tickVal * 750;
  793. int val = (int)this->tickVal;
  794. if( val < 1 )
  795. {
  796. bool ret = rend;
  797. rend = 0;
  798. return ret;
  799. }
  800. if( val > 25 )
  801. val = 25;
  802. this->tickVal -= val;
  803. if( ( animation | 0x1 ) == animation ) // sichtbar
  804. {
  805. if( alpha < 255 )
  806. {
  807. if( alpha + val >= 255 )
  808. {
  809. alpha = 255;
  810. for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
  811. {
  812. members->z( i )->setPosition( i % 4 );
  813. members->z( i )->setSichtbar( 1 );
  814. }
  815. }
  816. else
  817. alpha += val;
  818. rend = 1;
  819. }
  820. }
  821. else // unsichtbar
  822. {
  823. if( alpha > 0 )
  824. {
  825. if( alpha - val < 0 )
  826. alpha = 0;
  827. else
  828. alpha -= val;
  829. rend = 1;
  830. }
  831. }
  832. bool ret = rend;
  833. rend = 0;
  834. return ret;
  835. }
  836. void SpielAuswahlFenster::doPublicMausEreignis( MausEreignis &me )
  837. {
  838. if( pos.x != 10 )
  839. return;
  840. me.mx -= pos.x;
  841. me.my -= pos.y;
  842. for( int i = 0; i < anzahl; i++ )
  843. members->z( i )->doPublicMausEreignis( me );
  844. if( me.mx < 0 || me.my < 0 )
  845. {
  846. me.mx += pos.x;
  847. me.my += pos.y;
  848. return;
  849. }
  850. if( me.mx > 200 || me.my > getAnzahlAufSeite() * 100 )
  851. {
  852. me.mx += pos.x;
  853. me.my += pos.y;
  854. return;
  855. }
  856. if( me.id == ME_RLinks )
  857. {
  858. int treffer = me.my / 100 + seite * 4;
  859. if( treffer >= anzahl )
  860. {
  861. me.mx += pos.x;
  862. me.my += pos.y;
  863. return;
  864. }
  865. if( treffer == auswahl )
  866. {
  867. me.mx += pos.x;
  868. me.my += pos.y;
  869. return;
  870. }
  871. if( auswahl >= 0 )
  872. members->z( auswahl )->setAuswahl( 0 );
  873. members->z( treffer )->setAuswahl( 1 );
  874. auswahl = treffer;
  875. rend = 1;
  876. }
  877. me.mx += pos.x;
  878. me.my += pos.y;
  879. }
  880. void SpielAuswahlFenster::render( Bild &zrObj )
  881. {
  882. int x = pos.x;
  883. int y = pos.y;
  884. int br = gr.x;
  885. int hö = gr.y;
  886. if( !zrObj.setDrawOptions( x, y, br, hö ) )
  887. return;
  888. zrObj.setAlpha( alpha );
  889. rahmen->setSize( br, hö );
  890. rahmen->render( zrObj );
  891. int rbr = rahmen->getRBreite();
  892. if( !zrObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
  893. {
  894. zrObj.releaseDrawOptions();
  895. zrObj.releaseAlpha();
  896. return;
  897. }
  898. for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
  899. members->z( i )->render( zrObj );
  900. zrObj.releaseDrawOptions();
  901. if( !anzahl )
  902. {
  903. Text t = "Dieser Account besitzt momentan noch keine Spiele.\nBesuche den Shop um neue Spiele zu erwerben!";
  904. tr->setSchriftSize( 12 );
  905. tr->renderText( 10, 10, t, zrObj, 0xFFFFFFFF );
  906. }
  907. zrObj.releaseDrawOptions();
  908. zrObj.releaseAlpha();
  909. }
  910. // constant
  911. int SpielAuswahlFenster::getAnzahl() const
  912. {
  913. return anzahl;
  914. }
  915. int SpielAuswahlFenster::getSeiteAnzahl() const
  916. {
  917. return ( anzahl / 4.0 == anzahl / 4 ) ? ( anzahl / 4 ) : ( anzahl / 4 + 1 );
  918. }
  919. int SpielAuswahlFenster::getSeite() const
  920. {
  921. return seite;
  922. }
  923. int SpielAuswahlFenster::getAnzahlAufSeite() const
  924. {
  925. return ( anzahl < seite * 4 + 4 ) ? ( anzahl - seite * 4 ) : 4;
  926. }
  927. bool SpielAuswahlFenster::hatAuswahl() const
  928. {
  929. return auswahl != -1;
  930. }
  931. SpielDaten *SpielAuswahlFenster::getAuswahl() const
  932. {
  933. return members->get( auswahl );
  934. }
  935. SpielDaten *SpielAuswahlFenster::zAuswahl() const
  936. {
  937. return members->z( auswahl );
  938. }
  939. bool SpielAuswahlFenster::istAuswahlErlubt() const
  940. {
  941. return auswahl != -1 && members->z( auswahl )->istErlaubt();
  942. }