SpieleKaufen.cpp 33 KB

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