Neuigkeiten.cpp 6.7 KB

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