Neuigkeiten.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. #include "Neuigkeiten.h"
  2. #include "../../Global/Variablen.h"
  3. #include "../../Global/Initialisierung.h"
  4. #include <Punkt.h>
  5. #include <Globals.h>
  6. #include <InitDatei.h>
  7. // Inhalt der NewsThread Klasse aus Neuigkeiten.h
  8. // Konstruktor
  9. NewsThread::NewsThread(const char* name, KSGScriptObj* obj, Neuigkeiten* n)
  10. {
  11. scriptName = new Text(name);
  12. this->obj = obj;
  13. news = n;
  14. start();
  15. }
  16. // Destruktor
  17. NewsThread::~NewsThread()
  18. {
  19. scriptName->release();
  20. obj->release();
  21. news->release();
  22. }
  23. // nicht constant
  24. void NewsThread::thread()
  25. {
  26. if (!newsClient)
  27. newsClient = mainClient->createNewsServerClient();
  28. if (!newsClient)
  29. {
  30. news->endLaden(mainClient->getLetzterFehler());
  31. delete this;
  32. return;
  33. }
  34. if (!newsClient->verbinde())
  35. {
  36. news->endLaden(newsClient->getLetzterFehler());
  37. run = 0;
  38. delete this;
  39. return;
  40. }
  41. if (!newsClient->ladeSeite(scriptName->getText()))
  42. {
  43. news->endLaden(newsClient->getLetzterFehler());
  44. run = 0;
  45. delete this;
  46. return;
  47. }
  48. newsClient->trenne(0);
  49. Text* pfad = new Text("data/tmp/news/");
  50. pfad->append(scriptName->getText());
  51. pfad->append("/seite.ksgs");
  52. obj->setScriptDatei(pfad);
  53. if (!obj->neuLaden())
  54. {
  55. news->endLaden("Fehler beim laden der Seite.");
  56. run = 0;
  57. delete this;
  58. return;
  59. }
  60. news->endLaden(0);
  61. run = 0;
  62. delete this;
  63. }
  64. void KSGSRückruf(void* p, RCArray< KSGSVariable >* parameter, KSGSVariable** ret)
  65. {
  66. if (!p)
  67. return;
  68. ((Neuigkeiten*)p)->rückruf(parameter, ret);
  69. }
  70. // Inhalt der Neuigkeiten Klasse aus Neuigkeiten.h
  71. // Konstruktor
  72. Neuigkeiten::Neuigkeiten(Fenster* zNachLoginFenster, int x)
  73. : Zeichnung()
  74. {
  75. bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
  76. pos = Punkt(x, 67);
  77. gr = Punkt(102, 32);
  78. rahmen = new LRahmen();
  79. rahmen->setFarbe(0xFFFFFFFF);
  80. rahmen->setSize(102, 32);
  81. alpha = 0;
  82. animation = 0;
  83. wirdGeladen = 0;
  84. sichtbar = 0;
  85. tickVal = 0;
  86. prozent1 = 0;
  87. prozent2 = 0;
  88. begPos = Punkt(0, 0);
  89. begGröße = Punkt(0, 0);
  90. größe1 = Punkt(102, 32);
  91. pos1 = Punkt(x, 67);
  92. größe2 = Punkt(800, 500);
  93. pos2 = bildschirmGröße / 2 - größe2 / 2;
  94. fehler = initTextFeld(5, 5, 790, 490, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "");
  95. laden = (Animation2D*)ladeAnimation->dublizieren();
  96. laden->setSichtbar(0);
  97. laden->setPosition(375, 225);
  98. getThis();
  99. zNachLoginFenster->addMember(this);
  100. ksgsDLL = Framework::getDLLRegister()->ladeDLL("KSGScript.dll", "data/bin/KSGScript.dll");
  101. if (!ksgsDLL)
  102. {
  103. fehler->setText("Die DLL Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden.");
  104. fehler->addStyle(TextFeld::Style::Sichtbar);
  105. script = 0;
  106. }
  107. else
  108. {
  109. KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress(ksgsDLL, KSGS_START_FUNKTION);
  110. if (!getKSGSZeichnung)
  111. {
  112. fehler->setText("Die Funktion '" KSGS_START_FUNKTION "' konnte in der DLL Datei 'data/bin/KSGScript.dll'\nnicht gefunden werden.");
  113. fehler->addStyle(TextFeld::Style::Sichtbar);
  114. script = 0;
  115. }
  116. else
  117. {
  118. script = getKSGSZeichnung();
  119. script->setSize(800, 500);
  120. script->setBildschirmZ(dynamic_cast<Bildschirm*>(uiFactory.initParam.bildschirm->getThis()));
  121. script->setSchriftZ(dynamic_cast<Schrift*>(uiFactory.initParam.schrift->getThis()));
  122. script->setCallbackParam(this);
  123. script->setCallbackFunktion(KSGSRückruf);
  124. wirdGeladen = 1;
  125. laden->setSichtbar(1);
  126. getThis();
  127. new NewsThread("Client/Start", dynamic_cast<KSGScriptObj*>(script->getThis()), this);
  128. }
  129. }
  130. }
  131. // Destruktor
  132. Neuigkeiten::~Neuigkeiten()
  133. {
  134. rahmen->release();
  135. if (script)
  136. {
  137. script->reset();
  138. script->release();
  139. }
  140. if (ksgsDLL)
  141. Framework::getDLLRegister()->releaseDLL("KSGScript.dll");
  142. fehler->release();
  143. laden->release();
  144. }
  145. // nicht constant
  146. void Neuigkeiten::setSichtbar(bool sicht)
  147. {
  148. begPos = pos;
  149. begGröße = gr;
  150. animation |= (sicht ? 0x1 : 0x2);
  151. rend = 1;
  152. }
  153. void Neuigkeiten::endLaden(const char* err)
  154. {
  155. laden->setSichtbar(0);
  156. wirdGeladen = 0;
  157. if (err)
  158. {
  159. fehler->setText(err);
  160. fehler->addStyle(TextFeld::Style::Sichtbar);
  161. }
  162. else
  163. {
  164. fehler->setText("");
  165. fehler->removeStyle(TextFeld::Style::Sichtbar);
  166. }
  167. }
  168. void Neuigkeiten::rückruf(RCArray< KSGSVariable >* parameter, KSGSVariable** ret)
  169. {
  170. if (wirdGeladen)
  171. return;
  172. KSGSVariable* befehl = parameter->z(0);
  173. if (!befehl)
  174. return;
  175. Text* b = befehl->getText();
  176. if (!b || !b->getLength())
  177. {
  178. if (b)
  179. b->release();
  180. return;
  181. }
  182. wirdGeladen = 1;
  183. laden->setSichtbar(1);
  184. new NewsThread(b->getText(), dynamic_cast<KSGScriptObj*>(script->getThis()), dynamic_cast<Neuigkeiten*>(getThis()));
  185. b->release();
  186. }
  187. void Neuigkeiten::doPublicMausEreignis(MausEreignis& me)
  188. {
  189. if (wirdGeladen)
  190. return;
  191. me.mx -= pos.x;
  192. me.my -= pos.y;
  193. if (script && sichtbar)
  194. script->doPublicMausEreignis(me);
  195. me.mx += pos.x;
  196. me.my += pos.y;
  197. }
  198. void Neuigkeiten::doTastaturEreignis(TastaturEreignis& te)
  199. {
  200. if (wirdGeladen)
  201. return;
  202. if (script && sichtbar)
  203. script->doTastaturEreignis(te);
  204. }
  205. bool Neuigkeiten::tick(double z)
  206. {
  207. rend |= laden->tick(z);
  208. rend |= fehler->tick(z);
  209. if (wirdGeladen)
  210. {
  211. bool ret = rend;
  212. rend = 0;
  213. return ret;
  214. }
  215. if (script && sichtbar)
  216. rend |= script->tick(z);
  217. tickVal += z * 150;
  218. int val = (int)tickVal;
  219. if (val < 1)
  220. {
  221. bool ret = rend;
  222. rend = 0;
  223. return ret;
  224. }
  225. tickVal -= val;
  226. if ((animation | 0x1) == animation) // Einblenden
  227. {
  228. if (prozent1 != 100)
  229. {
  230. prozent1 += val;
  231. if (prozent1 >= 100)
  232. prozent1 = 100;
  233. pos = begPos + (Punkt)(((Vec2< double >)(pos2 - begPos) / 100.0) * prozent1);
  234. gr = begGröße + (Punkt)(((Vec2< double >)(größe2 - begGröße) / 100.0) * prozent1);
  235. }
  236. else if (alpha != 255)
  237. {
  238. alpha += val * 2;
  239. if (alpha >= 255 || (animation | 0x2) == animation)
  240. {
  241. alpha = 255;
  242. animation &= ~0x1;
  243. sichtbar = 1;
  244. prozent1 = 0;
  245. }
  246. }
  247. rend = 1;
  248. }
  249. if ((animation | 0x2) == animation) // ausblenden
  250. {
  251. if (alpha != 0)
  252. {
  253. alpha -= val * 2;
  254. if (alpha < 0)
  255. alpha = 0;
  256. }
  257. else
  258. {
  259. prozent2 += val;
  260. if (prozent2 > 100)
  261. prozent2 = 100;
  262. pos = begPos + (Punkt)(((Vec2< double >)(pos1 - begPos) / 100.0) * prozent2);
  263. gr = begGröße + (Punkt)(((Vec2< double >)(größe1 - begGröße) / 100.0) * prozent2);
  264. if (prozent2 == 100)
  265. {
  266. prozent2 = 0;
  267. animation &= ~0x2;
  268. sichtbar = 0;
  269. }
  270. }
  271. rend = 1;
  272. }
  273. bool ret = rend;
  274. rend = 0;
  275. return ret;
  276. }
  277. void Neuigkeiten::render(Bild& zRObj)
  278. {
  279. if (pos == pos1)
  280. return;
  281. if (!zRObj.setDrawOptions(pos.x, pos.y, gr.x, gr.y))
  282. return;
  283. rahmen->setSize(gr);
  284. rahmen->render(zRObj);
  285. int rbr = rahmen->getRBreite();
  286. zRObj.setAlpha((unsigned char)alpha);
  287. fehler->render(zRObj);
  288. if (script)
  289. script->render(zRObj);
  290. laden->render(zRObj);
  291. zRObj.releaseAlpha();
  292. zRObj.releaseDrawOptions();
  293. }
  294. // constant
  295. bool Neuigkeiten::istAnimiert() const
  296. {
  297. return animation != 0;
  298. }
  299. bool Neuigkeiten::istSichtbar() const
  300. {
  301. return sichtbar || prozent1 != 0;
  302. }