ImSpiel.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #include "ImSpiel.h"
  2. #include <Fenster.h>
  3. #include <Schrift.h>
  4. #include "..\..\Leser\KartenLeser.h"
  5. #include "..\..\Global\Variablen.h"
  6. typedef SpielV* ( *DllStart )( void );
  7. // Inhalt der ImSpielObj Klasse aus ImSpiel.h
  8. // Konstruktor
  9. ImSpiel::ImSpiel( Schrift *zSchrift )
  10. : Thread()
  11. {
  12. sichtbar = 0;
  13. ladenFenster = 0;
  14. spielFenster = 0;
  15. schrift = zSchrift->getThis();
  16. ladenStatus = 0;
  17. karteId = 0;
  18. mainDll = 0;
  19. dllName = 0;
  20. rend = 0;
  21. ref = 1;
  22. }
  23. // Destruktor
  24. ImSpiel::~ImSpiel()
  25. {
  26. if( sichtbar )
  27. setSichtbar( 0 );
  28. schrift->release();
  29. }
  30. // nicht constant
  31. void ImSpiel::setSichtbar( bool sichtbar )
  32. {
  33. if( sichtbar && !this->sichtbar )
  34. {
  35. ladenFenster = new SpielLaden( schrift );
  36. spielFenster = 0;
  37. ladenStatus = 0;
  38. karteId = 0;
  39. mainDll = 0;
  40. dllName = new Text( "" );
  41. this->sichtbar = 1;
  42. }
  43. else if( !sichtbar && this->sichtbar )
  44. {
  45. if( ladenFenster )
  46. ladenFenster->release();
  47. if( spielFenster )
  48. spielFenster->release();
  49. if( mainDll )
  50. dllDateien->releaseDLL( *dllName );
  51. dllName->release();
  52. this->sichtbar = 0;
  53. }
  54. }
  55. void ImSpiel::beginnLaden( int karteId, SpielerTeamStruktur *sts )
  56. {
  57. if( !sichtbar )
  58. return;
  59. ladenFenster->setSpielerTeamStruktur( sts );
  60. ladenFenster->setKarte( karteId );
  61. ladenFenster->setSichtbar( 1 );
  62. this->karteId = karteId;
  63. spielKlient->bereitZumLaden();
  64. rend = 1;
  65. start();
  66. }
  67. void ImSpiel::lBAddSpieler( int accountId, int spielerNummer )
  68. {
  69. if( !sichtbar )
  70. return;
  71. ladenFenster->addSpieler( accountId, spielerNummer );
  72. rend = 1;
  73. }
  74. void ImSpiel::lBSetSpielerProzent( int accountId, int prozent )
  75. {
  76. if( !sichtbar )
  77. return;
  78. ladenFenster->setSpielerFortschritt( accountId, prozent );
  79. rend = 1;
  80. }
  81. void ImSpiel::lBSetSpielerPing( int accountId, int ping )
  82. {
  83. if( !sichtbar )
  84. return;
  85. ladenFenster->setSpielerPing( accountId, ping );
  86. rend = 1;
  87. }
  88. void ImSpiel::spielNachricht( int län, char *bytes )
  89. {
  90. if( !sichtbar )
  91. return;
  92. if( ladenStatus > 1 )
  93. spielFenster->nachricht( län, bytes );
  94. }
  95. void ImSpiel::endLaden()
  96. {
  97. if( !sichtbar )
  98. return;
  99. ladenFenster->setSichtbar( 0 );
  100. }
  101. void ImSpiel::thread()
  102. {
  103. KartenLeser *reader = new KartenLeser();
  104. reader->setKarteId( karteId );
  105. Text *pfad = reader->getSpielPfad();
  106. pfad->append( "bin/" );
  107. pfad->append( reader->getSpielName() );
  108. pfad->append( ".dll" );
  109. dllName->setText( "Spiele/" );
  110. dllName->append( reader->getSpielName() );
  111. reader->release();
  112. dllName->append( ".dll" );
  113. mainDll = dllDateien->ladeDLL( *dllName, *pfad );
  114. if( !mainDll )
  115. {
  116. Text *nachricht = new Text( "Die Spiel DLL " );
  117. nachricht->append( pfad->getText() );
  118. nachricht->append( " konnte nicht geladen werden.\n" );
  119. nachricht->append( "Wenn sie nicht existiert dann installiere das Spiel neu." );
  120. WMessageBox( 0, new Text( "Unerwarteter Fehler" ), nachricht, MB_ICONERROR );
  121. //------------------------------
  122. exit( 0 );
  123. }
  124. pfad->release();
  125. DllStart getSpielKlasse = (DllStart)GetProcAddress( mainDll, "getSpielKlasse" );
  126. if( !getSpielKlasse )
  127. {
  128. Text *nachricht = new Text( "Die Spiel DLL " );
  129. nachricht->append( pfad->getText() );
  130. nachricht->append( " konnte nicht geladen werden.\n" );
  131. nachricht->append( "Die Einstiegsfunktion getSpielKlasse() wurde nicht gefunden." );
  132. WMessageBox( 0, new Text( "Unerwarteter Fehler" ), nachricht, MB_ICONERROR );
  133. //------------------------------
  134. exit( 0 );
  135. }
  136. int port = 0;
  137. Text ip;
  138. infoKlient->getKartenServer( karteId, &port, &ip );
  139. if( kartenKlient->verbinde( port, ip ) )
  140. kartenKlient->downloadKarte( karteId );
  141. spielFenster = getSpielKlasse();
  142. ladenStatus = 1;
  143. spielFenster->setKarteId( karteId );
  144. spielFenster->setKlients( infoKlient->getThis(), spielKlient->getThis() );
  145. spielFenster->setBildschirm( hauptScreen->getThis() );
  146. spielFenster->setSchrift( schrift->getThis() );
  147. spielFenster->ladeDaten();
  148. ladenStatus = 2;
  149. run = 0;
  150. }
  151. bool ImSpiel::tick( double tickVal )
  152. {
  153. if( !sichtbar )
  154. return 0;
  155. if( ladenStatus < 3 ) // Vor dem Spiel
  156. rend |= ladenFenster->tick( tickVal );
  157. if( ladenStatus == 2 ) // Im spiel
  158. {
  159. rend |= spielFenster->tick( tickVal );
  160. if( spielFenster->läuft() == 1 )
  161. {
  162. ladenStatus = 3;
  163. rend = 1;
  164. }
  165. }
  166. if( ladenStatus == 3 ) // Ende des Spiels
  167. {
  168. rend |= spielFenster->tick( tickVal );
  169. if( !spielFenster->läuft() )
  170. {
  171. ladenStatus = 4;
  172. aktion = 6; // Spiel Statistik laden (Render => new AktionsThread( 20, 0, 0, 0, 0, 0 ))
  173. rend = 1;
  174. }
  175. }
  176. bool ret = rend;
  177. rend = 0;
  178. return ret;
  179. }
  180. void ImSpiel::doMausEreignis( MausEreignis &me )
  181. {
  182. if( !sichtbar )
  183. return;
  184. if( ladenStatus > 1 )
  185. spielFenster->doMausEreignis( me );
  186. }
  187. void ImSpiel::doTastaturEreignis( TastaturEreignis &te )
  188. {
  189. if( !sichtbar )
  190. return;
  191. if( ladenStatus > 1 )
  192. spielFenster->doTastaturEreignis( te );
  193. }
  194. void ImSpiel::render( Bild &zRObj )
  195. {
  196. if( !sichtbar )
  197. return;
  198. if( ladenStatus < 3 && ( !spielFenster || spielFenster->läuft() == 3 ) )
  199. ladenFenster->render( zRObj );
  200. if( ladenStatus == 3 || ladenStatus == 2 )
  201. spielFenster->render( zRObj );
  202. }
  203. // constant
  204. int ImSpiel::getKarteId() const
  205. {
  206. return karteId;
  207. }
  208. bool ImSpiel::istSichtbar() const
  209. {
  210. return sichtbar;
  211. }
  212. // Reference Counting
  213. ImSpiel *ImSpiel::getThis()
  214. {
  215. ref++;
  216. return this;
  217. }
  218. ImSpiel *ImSpiel::release()
  219. {
  220. ref--;
  221. if( !ref )
  222. delete this;
  223. return 0;
  224. }