Neuigkeiten.cpp 6.8 KB

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