SpieleKaufen.cpp 28 KB

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