SpieleKaufen.cpp 29 KB

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