Neuigkeiten.cpp 8.0 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( 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( 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. }