SpieleKaufen.cpp 31 KB

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