Neuigkeiten.cpp 7.9 KB

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