Spiel.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. #include "Spiel.h"
  2. #define TICK 0.03333333
  3. // Konstruktor
  4. Spiel::Spiel()
  5. {
  6. isRunning = 0;
  7. log = 0;
  8. spielerAnzahl = 0;
  9. zAccounts = 0;
  10. spielId = 0;
  11. karteId = 0;
  12. pause = 0;
  13. gameTicks = 0;
  14. ende = 1;
  15. stat = new Statistik();
  16. ref = 1;
  17. }
  18. // Destruktor
  19. Spiel::~Spiel()
  20. {
  21. stat->release();
  22. if( psqldb )
  23. psqldb->release();
  24. }
  25. // nicht constant
  26. void Spiel::setPSQLK( SSDatenbankV *psqldb )
  27. {
  28. if( this->psqldb )
  29. this->psqldb->release();
  30. this->psqldb = psqldb;
  31. stat->setPSQLDB( psqldb->getThis() );
  32. }
  33. // call 1
  34. void Spiel::setSpielId( int id )
  35. {
  36. spielId = id;
  37. stat->setSpielId( id );
  38. }
  39. // call 2
  40. void Spiel::setKarteId( int karteId )
  41. {
  42. this->karteId = karteId;
  43. stat->setKarteId( karteId );
  44. }
  45. // call 3
  46. void Spiel::setTempPfad( char *pfad )
  47. {
  48. mapPfad = pfad;
  49. mapPfad += "/";
  50. }
  51. // call 3.5
  52. void Spiel::setAccounts( int anzahl, Array< int > *zAccounts )
  53. {
  54. this->zAccounts = zAccounts->getThis();
  55. spielerAnzahl = anzahl;
  56. }
  57. // call 4
  58. void Spiel::setKlients( int anzahl, RCArray< SSKlientV > *zKlients )
  59. {
  60. this->zKlients = zKlients->getThis();
  61. }
  62. // call 5
  63. void Spiel::setSpielerNummern( int anzahl, Array< int > *spielerNummern )
  64. {
  65. MapReader *reader = new MapReader( karteId, psqldb->getThis(), mapPfad );
  66. reader->ladeKarte( this );
  67. reader->release();
  68. for( int i = 0; i < anzahl; i++ )
  69. {
  70. for( auto s = spieler.getIterator(); s; s++ )
  71. {
  72. if( s->getSpielerNummer() == spielerNummern->get( i ) )
  73. {
  74. s->setAccount( zAccounts->get( i ) );
  75. s->setKlient( new Klient( zKlients->get( i ) ) );
  76. break;
  77. }
  78. }
  79. }
  80. zAccounts = zAccounts->release();
  81. zKlients = zKlients->release();
  82. stat->setTeams( spielerAnzahl, &teams );
  83. stat->setSpieler( spielerAnzahl, &spieler );
  84. }
  85. // call 6
  86. void Spiel::run()
  87. {
  88. log = new Datei();
  89. Text *pfad = new Text( "../spiel log/" );
  90. pfad->append( spielId );
  91. pfad->append( "/verlauf.ksggl" );
  92. log->setDatei( pfad );
  93. log->remove();
  94. log->erstellen();
  95. log->open( Datei::Style::schreiben );
  96. time_t t;
  97. time( &t );
  98. srand( (unsigned int)t );
  99. log->schreibe( (char *)& spielerAnzahl, 4 );
  100. for( int i = 0; i < spielerAnzahl; i++ )
  101. {
  102. Spieler *tmp = spieler.z( i );
  103. if( tmp && tmp->zKlient() )
  104. {
  105. tmp->zKlient()->sendeInit( &spieler, -1 );
  106. log->schreibe( (char *)& i, 4 );
  107. int sNum = tmp->getSpielerNummer();
  108. log->schreibe( (char *)& sNum, 4 );
  109. tmp->zKlient()->sendeSpielerNummer( sNum, -1 );
  110. Text * name = psqldb->getAccountRufName( tmp->getAccountId() );
  111. char len = (char)( name ? name->getLength() : 0 );
  112. log->schreibe( &len, 1 );
  113. if( len )
  114. log->schreibe( name->getText(), len );
  115. if( name )
  116. name->release();
  117. }
  118. }
  119. __int64 randSeed = randG.getSeed();
  120. log->schreibe( (char *)& randSeed, 8 );
  121. Array< char > spielerStatus;
  122. ZeitMesser * zeit = new ZeitMesser();
  123. zeit->messungStart();
  124. isRunning = 1;
  125. ende = 0;
  126. double ausgleich = 0;
  127. double sZ = 0;
  128. gameTicks = -1;
  129. for( int i = 0; i < spielerAnzahl; i++ )
  130. {
  131. Spieler *tmp = spieler.z( i );
  132. if( tmp && tmp->zKlient() )
  133. tmp->zKlient()->sendeStart( gameTicks );
  134. }
  135. double rZeit = 0;
  136. while( !ende )
  137. {
  138. zeit->messungEnde();
  139. zeit->messungStart();
  140. double z = zeit->getSekunden();
  141. ausgleich += TICK - z;
  142. if( ausgleich > 0 )
  143. Sleep( (int)( ausgleich * 1000 ) );
  144. rZeit += z;
  145. while( sZ + TICK < rZeit && !ende )
  146. {
  147. c.lock();
  148. sZ += TICK;
  149. gameTicks++;
  150. char ch = 0;
  151. log->schreibe( &ch, 1 );
  152. tick( TICK );
  153. c.unlock();
  154. }
  155. }
  156. zeit->messungEnde();
  157. zeit->release();
  158. for( int i = 0; i < spielerAnzahl; i++ )
  159. {
  160. if( spieler.z( i ) && spieler.z( i )->zKlient() )
  161. {
  162. if( !spieler.z( i )->zTeam()->getPunkte() )
  163. {
  164. spielerStatus.set( 1, i ); // Datenbank Verloren
  165. spieler.z( i )->zKlient()->sendeSpielEnde( 0, 0 );
  166. }
  167. else
  168. {
  169. spielerStatus.set( 2, i ); // Datenbank Gewonnen
  170. spieler.z( i )->zKlient()->sendeSpielEnde( 1, 0 );
  171. }
  172. }
  173. if( spieler.z( i ) && ( !spieler.z( i )->zKlient() || !spieler.z( i )->zKlient()->istOnline() ) )
  174. spielerStatus.set( 3, i );
  175. }
  176. psqldb->setSpielStatusBeendet( spielId, 5 );
  177. for( int i = 0; i < spielerAnzahl; i++ )
  178. {
  179. Spieler *tmp = spieler.z( i );
  180. if( tmp )
  181. {
  182. psqldb->setSpielSpielerStatus( spielId, tmp->getAccountId(), tmp->getPunkte(), spielerStatus.get( i ) );
  183. psqldb->addSpielerStatistik( tmp->getAccountId(), spielId );
  184. }
  185. }
  186. log->close();
  187. log = log->release();
  188. isRunning = 0;
  189. }
  190. // call 7
  191. void Spiel::klientOffline( int accountId )
  192. {
  193. for( int i = 0; i < spielerAnzahl; i++ )
  194. {
  195. if( spieler.z( i )->getAccountId() == accountId )
  196. spieler.z( i )->zKlient()->offline();
  197. }
  198. }
  199. void Spiel::klientOnline( int accountId, SSKlientV *zKlient )
  200. {
  201. for( int i = 0; i < spielerAnzahl; i++ )
  202. {
  203. if( spieler.z( i )->getAccountId() == accountId )
  204. {
  205. c.lock();
  206. Spieler *s = spieler.z( i );
  207. Klient *tmp = s->zKlient();
  208. tmp->online( zKlient );
  209. tmp->sendeSpielerNummer( s->getSpielerNummer(), 0 );
  210. //--------------------------
  211. c.unlock();
  212. }
  213. }
  214. }
  215. void Spiel::nachricht( int accountId, int len, char *bytes )
  216. {
  217. }
  218. void Spiel::setPausiert( bool pausiert )
  219. {
  220. this->pause = pausiert;
  221. }
  222. void Spiel::tick( double zeit )
  223. {
  224. }
  225. void Spiel::addVariable( const char *name, Variable *var )
  226. {
  227. bool found = 0;
  228. for( auto v = variablen.getIterator(); v; v++ )
  229. {
  230. if( v->zName()->istGleich( name ) )
  231. {
  232. found = 1;
  233. break;
  234. }
  235. }
  236. if( !found )
  237. variablen.add( new VarPointer( name, var ) );
  238. else
  239. var->release();
  240. }
  241. void Spiel::setVariable( const char *name, Variable *var )
  242. {
  243. bool found = 0;
  244. for( auto v = variablen.getIterator(); v; v++ )
  245. {
  246. if( v->zName()->istGleich( name ) )
  247. {
  248. v->setVariable( var );
  249. break;
  250. }
  251. }
  252. if( !found )
  253. var->release();
  254. }
  255. void Spiel::addTeam( Team *team )
  256. {
  257. teams.add( team );
  258. }
  259. void Spiel::addSpieler( Spieler *spieler )
  260. {
  261. this->spieler.add( spieler );
  262. }
  263. Variable *Spiel::getVariable( const char *name ) const
  264. {
  265. for( auto v = variablen.getIterator(); v; v++ )
  266. {
  267. if( v->zName()->istGleich( name ) )
  268. return v->getVariable();
  269. }
  270. return 0;
  271. }
  272. Variable *Spiel::zVariable( const char *name ) const
  273. {
  274. for( auto v = variablen.getIterator(); v; v++ )
  275. {
  276. if( v->zName()->istGleich( name ) )
  277. return v->zVariable();
  278. }
  279. return 0;
  280. }
  281. bool Spiel::istPausiert() const
  282. {
  283. return pause;
  284. }
  285. // constant
  286. StatistikV *Spiel::getStatistik() const
  287. {
  288. return stat->getThis();
  289. }
  290. // Reference Counting
  291. SpielKlasse *Spiel::getThis()
  292. {
  293. ref++;
  294. return this;
  295. }
  296. SpielKlasse *Spiel::release()
  297. {
  298. if( !--ref )
  299. delete this;
  300. return 0;
  301. }