Spiel.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. #include "Spiel.h"
  2. #include <time.h>
  3. #include <DateiSystem.h>
  4. #include "Define.h"
  5. #include "SSKlient.h"
  6. #include "KartenLeser.h"
  7. #include "Statistik.h"
  8. #include "Team.h"
  9. #include "Laser.h"
  10. #include <M2Datei.h>
  11. #include <iostream>
  12. #ifdef WIN32
  13. #include <random>
  14. #else
  15. #include <math.h>
  16. #include <unistd.h>
  17. #include <stdlib.h>
  18. #define Sleep( x ) usleep( (x) * 1000 )
  19. #endif
  20. // Inhalt der Spiel Klasse aus Spiel.h
  21. // Konstruktor
  22. Spiel::Spiel()
  23. {
  24. zAccounts = 0;
  25. zKlients = 0;
  26. asteroids = new RCArray< Asteroid >();
  27. asteroidModels = new RCArray< Model2DData >();
  28. stat = new Statistik();
  29. teams = new RCArray< Team >();
  30. teamAnzahl = 0;
  31. spieler = new RCArray< Spieler >();
  32. shots = new RCArray< Laser >();
  33. objekte = new RCArray< SpielObjekt >();
  34. welt = new Welt2D();
  35. pixel = new RCArray< Pixel >();
  36. welt->setCircular( 1 );
  37. welt->setAirResistance( 0.001f );
  38. psqldb = 0;
  39. spielId = 0;
  40. karteId = 0;
  41. spielerAnzahl = 0;
  42. karte = 0;
  43. InitializeCriticalSection( &cs );
  44. sts = 0;
  45. log = 0;
  46. isRunning = 0;
  47. spielZeit = 0;
  48. ende = 1;
  49. nextSchussId = 1;
  50. nextAsteroid = 30;
  51. asteroidId = 0;
  52. pixelId = 0;
  53. ref = 1;
  54. }
  55. // Destruktor
  56. Spiel::~Spiel()
  57. {
  58. teams->release();
  59. stat->release();
  60. spieler->release();
  61. objekte->release();
  62. welt->release();
  63. asteroids->release();
  64. asteroidModels->release();
  65. if( psqldb )
  66. psqldb->release();
  67. if( karte )
  68. karte->release();
  69. if( sts )
  70. sts->release();
  71. pixel->release();
  72. DeleteCriticalSection( &cs );
  73. }
  74. // privat
  75. int Spiel::getTeamVonSpieler( int sNum )
  76. {
  77. for( int i = 0; i < spielerAnzahl; i++ )
  78. {
  79. Spieler *tmp = spieler->z( i );
  80. if( tmp && tmp->getSpielerNummer() == sNum )
  81. return tmp->zTeam() ? tmp->zTeam()->id : 0;
  82. }
  83. return 0;
  84. }
  85. // nicht constant
  86. void Spiel::setPSQLK( SSDatenbankV * psqldb )
  87. {
  88. if( this->psqldb )
  89. this->psqldb->release();
  90. this->psqldb = psqldb;
  91. stat->setPSQLDB( psqldb->getThis() );
  92. }
  93. void Spiel::setSpielId( int id )
  94. {
  95. spielId = id;
  96. stat->setSpielId( id );
  97. }
  98. void Spiel::setKarteId( int karteId )
  99. {
  100. this->karteId = karteId;
  101. stat->setKarteId( karteId );
  102. }
  103. void Spiel::setTempPfad( char *pfad )
  104. {
  105. mapPfad = pfad;
  106. mapPfad += "/";
  107. }
  108. void Spiel::setAccounts( int anzahl, Array< int > * zAccounts )
  109. {
  110. this->zAccounts = zAccounts->getThis();
  111. spielerAnzahl = anzahl;
  112. }
  113. void Spiel::setKlients( int anzahl, RCArray< SSKlientV > * zKlients )
  114. {
  115. this->zKlients = zKlients->getThis();
  116. }
  117. void Spiel::setSpielerNummern( int anzahl, Array< int > * spielerNummern )
  118. {
  119. if( !sts )
  120. {
  121. sts = new SpielerTeamStruktur();
  122. KartenLeser *reader = new KartenLeser( karteId, psqldb->getThis(), mapPfad );
  123. reader->ladeSpielerTeamStruktur( sts );
  124. if( karte )
  125. karte->release();
  126. karte = reader->ladeKarte( sts );
  127. reader->release();
  128. for( int i = 0; i < sts->teamAnzahl; i++ )
  129. teams->set( karte->createTeam( i ), i );
  130. stat->setTeamNamen( sts->teamName->getThis() );
  131. int objektAnzahl = karte->getObjektAnzahl();
  132. for( int i = 0; i < objektAnzahl; i++ )
  133. {
  134. SpielObjekt *obj = karte->createObjekt( i );
  135. welt->addObject( obj->getThis() );
  136. objekte->set( obj, i );
  137. }
  138. welt->setSize( karte->getSize().x, karte->getSize().y );
  139. welt->setSize( 1 );
  140. }
  141. for( int i = 0; i < anzahl; i++ )
  142. {
  143. Spieler *tmp = karte->createSpieler( spielerNummern->get( i ) );
  144. if( tmp )
  145. {
  146. int team = 0;
  147. int von = 0;
  148. int bis = 0;
  149. for( int j = 0; j < sts->teamAnzahl; j++ )
  150. {
  151. bis = von + ( sts->teamSize->hat( j ) ? sts->teamSize->get( j ) : 0 );
  152. if( spielerNummern->get( i ) >= von && spielerNummern->get( i ) < bis )
  153. {
  154. team = j;
  155. break;
  156. }
  157. von = bis;
  158. }
  159. tmp->setTeam( teams->get( team ) );
  160. teams->z( team )->spieler->add( tmp );
  161. }
  162. welt->addObject( tmp->getThis() );
  163. spieler->set( tmp, i );
  164. }
  165. for( int i = 0; i < anzahl; i++ )
  166. spieler->z( i )->setAccountId( zAccounts->hat( i ) ? zAccounts->get( i ) : 0 );
  167. for( int i = 0; i < anzahl; i++ )
  168. spieler->z( i )->setKlient( new Klient( zKlients->get( i ) ) );
  169. stat->setSpieler( spielerAnzahl, spieler );
  170. zAccounts = zAccounts->release();
  171. zKlients = zKlients->release();
  172. teamAnzahl = 0;
  173. for( int i = 0; i < sts->teamAnzahl; i++ )
  174. if( teams->z( i )->spieler->getEintragAnzahl() )
  175. teamAnzahl++;
  176. }
  177. void Spiel::klientOffline( int accountId )
  178. {
  179. for( int i = 0; i < spielerAnzahl; i++ )
  180. {
  181. if( spieler->z( i )->getAccountId() == accountId )
  182. spieler->z( i )->offline();
  183. }
  184. }
  185. void Spiel::klientOnline( int accountId, SSKlientV * zKlient )
  186. {
  187. for( int i = 0; i < spielerAnzahl; i++ )
  188. {
  189. if( spieler->z( i )->getAccountId() == accountId )
  190. {
  191. EnterCriticalSection( &cs );
  192. Spieler *s = spieler->z( i );
  193. s->online( zKlient );
  194. Klient *tmp = spieler->z( i )->zKlient();
  195. tmp->sendeSpielerNummer( s->getSpielerNummer(), 0 );
  196. //--------------------------
  197. LeaveCriticalSection( &cs );
  198. }
  199. }
  200. }
  201. void Spiel::nachricht( int accountId, int len, char *bytes )
  202. {
  203. if( !isRunning || ende )
  204. return;
  205. EnterCriticalSection( &cs );
  206. if( ende )
  207. {
  208. LeaveCriticalSection( &cs );
  209. return;
  210. }
  211. char *msgBeg = bytes;
  212. int msgLen = len;
  213. int msgAccount = accountId;
  214. bool saveMSG = 1;
  215. len--;
  216. switch( *bytes )
  217. {
  218. case 0:
  219. case 1:
  220. case 2:
  221. case 3:
  222. case 4:
  223. case 5:
  224. case 6:
  225. case 7:
  226. for( int i = 0; i < spielerAnzahl; i++ )
  227. {
  228. Spieler *tmp = spieler->z( i );
  229. if( tmp && tmp->getAccountId() == accountId )
  230. {
  231. if( !tmp->istAmLeben() )
  232. break;
  233. if( !tmp->setTastataturStatus( (TastaturStatus)( (int)( *bytes ) / 2 ), ( (int)( *bytes ) % 2 ) == 0 ) )
  234. {
  235. saveMSG = 0;
  236. break;
  237. }
  238. if( *bytes != 6 && *bytes != 7 )
  239. {
  240. for( int j = 0; j < spielerAnzahl; j++ )
  241. {
  242. Spieler *s = spieler->z( j );
  243. if( s && s->zKlient() )
  244. s->zKlient()->sendeTastaturStatus( tmp->getSpielerNummer(), (TastaturStatus)( (int)( *bytes ) / 2 ), ( (int)( *bytes ) % 2 ) == 0, spielZeit );
  245. }
  246. }
  247. break;
  248. }
  249. }
  250. break;
  251. case 8: // chat Nachricht
  252. if( 1 )
  253. {
  254. bytes++;
  255. Text *txt = psqldb->getAccountRufName( accountId );
  256. txt->append( ": " );
  257. txt->append( bytes, len );
  258. for( int i = 0; i < spielerAnzahl; i++ )
  259. {
  260. Spieler *tmp = spieler->z( i );
  261. if( tmp && tmp->zKlient() )
  262. tmp->zKlient()->sendeChatNachricht( txt->getText(), spielZeit );
  263. }
  264. txt->release();
  265. len = 0;
  266. }
  267. break;
  268. case 9: // Skill verwendung
  269. {
  270. bytes++;
  271. char art = *bytes;
  272. len--;
  273. for( int i = 0; i < spielerAnzahl; i++ )
  274. {
  275. Spieler *tmp = spieler->z( i );
  276. if( tmp && tmp->getAccountId() == accountId )
  277. {
  278. if( !tmp->istAmLeben() )
  279. break;
  280. if( !tmp->setSkill( art ) )
  281. {
  282. saveMSG = 0;
  283. break;
  284. }
  285. for( int j = 0; j < spielerAnzahl; j++ )
  286. {
  287. Spieler *s = spieler->z( j );
  288. if( s && s->zKlient() )
  289. s->zKlient()->sendeSkillNachricht( tmp->getSpielerNummer(), art, spielZeit );
  290. }
  291. break;
  292. }
  293. }
  294. break;
  295. }
  296. case 0xA: // Use active skill
  297. {
  298. bytes++;
  299. char id = *bytes;
  300. len--;
  301. for( int i = 0; i < spielerAnzahl; i++ )
  302. {
  303. Spieler *tmp = spieler->z( i );
  304. if( tmp && tmp->getAccountId() == accountId )
  305. {
  306. if( !tmp->istAmLeben() )
  307. break;
  308. tmp->useSkill( id );
  309. for( int j = 0; j < spielerAnzahl; j++ )
  310. {
  311. Spieler *s = spieler->z( j );
  312. if( s && s->zKlient() )
  313. s->zKlient()->sendeUseSkillNachricht( tmp->getSpielerNummer(), id, spielZeit );
  314. }
  315. break;
  316. }
  317. }
  318. break;
  319. }
  320. default:
  321. saveMSG = 0;
  322. }
  323. if( len )
  324. {
  325. // error
  326. }
  327. if( log && log->istOffen() && saveMSG )
  328. {
  329. char c = 1;
  330. log->schreibe( &c, 1 );
  331. int spielerNum = 0;
  332. for( int i = 0; i < spielerAnzahl; i++ )
  333. {
  334. Spieler *tmp = spieler->z( i );
  335. if( tmp && tmp->getAccountId() == msgAccount )
  336. {
  337. spielerNum = tmp->getSpielerNummer();
  338. break;
  339. }
  340. }
  341. log->schreibe( (char *)& spielerNum, 4 );
  342. short l = (short)msgLen;
  343. log->schreibe( (char *)& l, 2 );
  344. log->schreibe( msgBeg, l );
  345. }
  346. LeaveCriticalSection( &cs );
  347. }
  348. void Spiel::tick( double zeit )
  349. {
  350. // Objekte updaten
  351. welt->tick( zeit );
  352. // Spieler Updaten
  353. for( int i = 0; i < spielerAnzahl; i++ )
  354. {
  355. Spieler *tmp = spieler->z( i );
  356. if( tmp )
  357. {
  358. if( tmp->doNeedWiederbelebung() )
  359. { // Wiederbelebung
  360. tmp->wiederbeleben();
  361. for( int j = 0; j < spielerAnzahl; j++ )
  362. {
  363. Spieler *s = spieler->z( j );
  364. if( s )
  365. s->zKlient()->sendeWiederbelebung( tmp->getSpielerNummer(), spielZeit );
  366. }
  367. }
  368. }
  369. }
  370. // Schüsse Collision
  371. int anz = shots->getEintragAnzahl();
  372. for( int i = 0; i < anz; i++ )
  373. {
  374. Laser *tmp = shots->z( i );
  375. if( tmp )
  376. {
  377. if( tmp->getIntensity() <= 0 )
  378. { // Schuss existiert nicht mehr
  379. for( int j = 0; j < spielerAnzahl; j++ )
  380. {
  381. Spieler *s = spieler->z( j );
  382. if( s )
  383. s->zKlient()->sendeTreffer( tmp->getId(), -1, spielZeit, 0, 0 );
  384. }
  385. welt->removeObject( tmp );
  386. shots->remove( i );
  387. anz--;
  388. i--;
  389. }
  390. else
  391. { // Schuss existiert noch
  392. int team = getTeamVonSpieler( tmp->getSpieler() );
  393. for( int j = 0; j < spielerAnzahl; j++ )
  394. {
  395. Spieler *attacked = spieler->z( j );
  396. if( attacked && attacked->zTeam() && attacked->zTeam()->id != team && attacked->istTreffer( tmp->getPosition() ) )
  397. { // Treffer
  398. Spieler *attacker = 0;
  399. for( int k = 0; k < spielerAnzahl; k++ )
  400. {
  401. Spieler *tmpS = spieler->z( k );
  402. if( tmpS && tmpS->getSpielerNummer() == tmp->getSpieler() )
  403. attacker = tmpS;
  404. }
  405. double intens = tmp->getIntensity() * ( ( tmp->getSpeed() - attacked->getSpeed() ).getLength() / 200 );
  406. bool kill = attacked->nimmSchaden( intens, attacker ? attacker->getLevel() : 1 );
  407. if( tmp->getSpeed().getLengthSq() > 0 )
  408. attacked->impuls( tmp->getPosition() - tmp->getSpeed(), tmp->getSpeed() * 0.3f );
  409. int skillP = attacker->getSkillP();
  410. attacker->machSchaden( intens, attacked->getLevel() );
  411. float erf = attacker->getEp();
  412. if( kill )
  413. attacker->addKill( attacked->getLevel() );
  414. for( int k = 0; k < spielerAnzahl; k++ )
  415. {
  416. Spieler *sp = spieler->z( k );
  417. if( sp )
  418. sp->zKlient()->sendeTreffer( tmp->getId(), attacked->getSpielerNummer(), spielZeit, erf, skillP );
  419. if( kill && sp )
  420. sp->zKlient()->sendeTod( attacked->getSpielerNummer(), tmp->getSpieler(), spielZeit );
  421. }
  422. if( kill )
  423. {
  424. if( teams->z( team - 1 ) )
  425. teams->z( team - 1 )->punkte++;
  426. if( teams->z( team - 1 )->punkte == teams->z( team - 1 )->maxPunkte )
  427. ende = 1;
  428. }
  429. welt->removeObject( tmp );
  430. shots->remove( i );
  431. anz--;
  432. i--;
  433. break;
  434. }
  435. }
  436. int aAnz = asteroids->getEintragAnzahl();
  437. for( int j = 0; j < aAnz; j++ )
  438. {
  439. Asteroid *a = asteroids->z( j );
  440. Vertex pos;
  441. __int64 seed = randG.getSeed();
  442. double intens = tmp->getIntensity() * ( ( tmp->getSpeed() - a->getSpeed() ).getLength() / 200 );
  443. Asteroid * b = a->istTreffer( tmp, &randG, asteroidId, pos );
  444. if( b )
  445. {
  446. float erf = 0;
  447. int skillP = 0;
  448. for( int k = 0; k < spielerAnzahl; k++ )
  449. {
  450. Spieler *s = spieler->z( k );
  451. if( s && s->getSpielerNummer() == tmp->getSpieler() )
  452. {
  453. s->addTreffer( (float)intens, 0 );
  454. erf = s->getEp();
  455. skillP = s->getSkillP();
  456. }
  457. }
  458. for( int k = 0; k < spielerAnzahl; k++ )
  459. {
  460. Spieler *s = spieler->z( k );
  461. if( s )
  462. s->zKlient()->sendeAsteroidTreffer( a->getId(), b->getId(), tmp->getId(), pos, seed, spielZeit, erf, skillP );
  463. }
  464. welt->removeObject( tmp );
  465. shots->remove( i );
  466. if( b->getMasse() > intens * 50 )
  467. {
  468. asteroids->add( (Asteroid *)b->getThis() );
  469. welt->addObject( b );
  470. }
  471. else
  472. {
  473. Pixel *p = new Pixel( b->getPosition(), b->getSpeed(), b->getMasse() / 50, pixelId++ );
  474. welt->addObject( p->getThis() );
  475. pixel->add( p );
  476. for( int k = 0; k < spielerAnzahl; k++ )
  477. {
  478. Spieler *s = spieler->z( k );
  479. if( s )
  480. s->zKlient()->sendePixel( b->getId(), p->getId(), spielZeit );
  481. }
  482. b->release();
  483. }
  484. if( a->getMasse() < intens * 50 )
  485. {
  486. Pixel *p = new Pixel( a->getPosition(), a->getSpeed(), a->getMasse() / 50, pixelId++ );
  487. welt->addObject( p->getThis() );
  488. pixel->add( p );
  489. for( int k = 0; k < spielerAnzahl; k++ )
  490. {
  491. Spieler *s = spieler->z( k );
  492. if( s )
  493. s->zKlient()->sendePixel( a->getId(), p->getId(), spielZeit );
  494. }
  495. welt->removeObject( a );
  496. asteroids->remove( j-- );
  497. aAnz--;
  498. }
  499. }
  500. }
  501. }
  502. }
  503. }
  504. // Neue Schüsse hinzufügen
  505. for( int i = 0; i < spielerAnzahl; i++ )
  506. {
  507. Spieler *tmp = spieler->z( i );
  508. if( tmp )
  509. {
  510. Laser *nL = tmp->getLaser( nextSchussId );
  511. if( nL )
  512. {
  513. nextSchussId++;
  514. welt->addObject( nL->getThis() );
  515. shots->add( nL );
  516. for( int j = 0; j < spielerAnzahl; j++ )
  517. {
  518. if( spieler->z( j ) && spieler->z( j )->zKlient() )
  519. spieler->z( j )->zKlient()->sendeSchuss( nL->getId(), nL->getSpieler(), nL->getPosition(), nL->getSpeed(), nL->getIntensity(), spielZeit );
  520. }
  521. }
  522. }
  523. }
  524. // Asteroiden
  525. nextAsteroid -= zeit;
  526. if( nextAsteroid <= 0 )
  527. {
  528. nextAsteroid += 30 + (float)randG.rand() * 30;
  529. if( asteroids->getEintragAnzahl() < 30 )
  530. {
  531. Vertex pos = Vertex( (float)randG.rand() * (float)welt->getWorldInfo().size.x, (float)randG.rand() * (float)welt->getWorldInfo().size.y );
  532. Vertex speed = Vertex( (float)randG.rand() * 100, (float)randG.rand() * 100 );
  533. float rot = 2 * (float)PI * (float)randG.rand();
  534. float rotS = (float)randG.rand();
  535. int index = (int)( (float)asteroidModels->getEintragAnzahl() * (float)randG.rand() );
  536. Asteroid *astr = new Asteroid( asteroidId++, pos, speed, rot, rotS, asteroidModels->get( index ) );
  537. asteroids->add( astr );
  538. welt->addObject( astr->getThis() );
  539. for( int j = 0; j < spielerAnzahl; j++ )
  540. {
  541. if( spieler->z( j ) && spieler->z( j )->zKlient() )
  542. spieler->z( j )->zKlient()->sendeAsteroid( astr->getId(), pos, speed, rot, rotS, index, spielZeit );
  543. }
  544. }
  545. }
  546. // Pixel
  547. int pixelAnz = pixel->getEintragAnzahl();
  548. for( int i = 0; i < pixelAnz; i++ )
  549. {
  550. Pixel *p = pixel->z( i );
  551. if( p->getEp() <= 0 )
  552. {
  553. for( int j = 0; j < spielerAnzahl; j++ )
  554. {
  555. if( spieler->z( j ) && spieler->z( j )->zKlient() )
  556. spieler->z( j )->zKlient()->sendeEp( p->getId(), -1, spielZeit );
  557. }
  558. pixel->remove( i-- );
  559. welt->removeObject( p );
  560. pixelAnz--;
  561. }
  562. else
  563. {
  564. for( auto s = spieler->getIterator(); s; s++ )
  565. {
  566. if( s->istTreffer( p->getPosition() ) )
  567. {
  568. s->addEp( p->getEp() );
  569. for( int j = 0; j < spielerAnzahl; j++ )
  570. {
  571. if( spieler->z( j ) && spieler->z( j )->zKlient() )
  572. spieler->z( j )->zKlient()->sendeEp( p->getId(), s->getSpielerNummer(), spielZeit );
  573. }
  574. pixel->remove( i-- );
  575. welt->removeObject( p );
  576. pixelAnz--;
  577. break;
  578. }
  579. }
  580. }
  581. }
  582. }
  583. void Spiel::run()
  584. {
  585. Text *pfad = psqldb->getSpielPfad( karteId );
  586. if( pfad )
  587. pfad->append( "/" );
  588. pfad->append( "models/asteroids.m2" );
  589. M2Datei *aDat = new M2Datei();
  590. aDat->setPfadZ( pfad );
  591. aDat->leseDaten();
  592. int anz = aDat->getModelAnzahl();
  593. for( int i = 0; i < anz; i++ )
  594. {
  595. asteroidModels->add( aDat->ladeModel( aDat->zModelName( i )->getText() ) );
  596. }
  597. log = new Datei();
  598. pfad = new Text( "../spiel log/" );
  599. pfad->append( spielId );
  600. pfad->append( "/verlauf.ksggl" );
  601. log->setDatei( pfad );
  602. log->remove();
  603. log->erstellen();
  604. log->open( Datei::Style::schreiben );
  605. time_t t;
  606. time( &t );
  607. srand( (unsigned int)t );
  608. log->schreibe( (char *)& spielerAnzahl, 4 );
  609. for( int i = 0; i < spielerAnzahl; i++ )
  610. {
  611. Spieler *tmp = spieler->z( i );
  612. if( tmp && tmp->zKlient() )
  613. {
  614. tmp->addSkill( new ShieldBoost() );
  615. tmp->addSkill( new SpeedBoost() );
  616. tmp->zKlient()->sendeInit( spieler, -1 );
  617. log->schreibe( (char *)& i, 4 );
  618. int sNum = tmp->getSpielerNummer();
  619. log->schreibe( (char *)& sNum, 4 );
  620. tmp->zKlient()->sendeSpielerNummer( sNum, -1 );
  621. int team = tmp->zTeam()->id;
  622. log->schreibe( (char *)& team, 4 );
  623. int farbe = tmp->getSpielerFarbe();
  624. log->schreibe( (char *)& farbe, 4 );
  625. farbe = tmp->zTeam()->farbe;
  626. log->schreibe( (char *)& farbe, 4 );
  627. Text * name = psqldb->getAccountRufName( tmp->getAccountId() );
  628. char len = (char)( name ? name->getLength() : 0 );
  629. log->schreibe( &len, 1 );
  630. if( len )
  631. log->schreibe( name->getText(), len );
  632. if( name )
  633. name->release();
  634. name = sts->teamName->z( team );
  635. len = (char)( name ? name->getLength() : 0 );
  636. log->schreibe( &len, 1 );
  637. if( len )
  638. log->schreibe( name->getText(), len );
  639. }
  640. }
  641. __int64 randSeed = randG.getSeed();
  642. log->schreibe( (char *)& randSeed, 8 );
  643. Array< char > spielerStatus;
  644. ZeitMesser * zeit = new ZeitMesser();
  645. zeit->messungStart();
  646. isRunning = 1;
  647. ende = 0;
  648. double ausgleich = 0;
  649. double sZ = 0;
  650. spielZeit = -1;
  651. for( int i = 0; i < spielerAnzahl; i++ )
  652. {
  653. Spieler *tmp = spieler->z( i );
  654. if( tmp && tmp->zKlient() )
  655. tmp->zKlient()->sendeStart( spielZeit );
  656. }
  657. double rZeit = 0;
  658. while( !ende )
  659. {
  660. zeit->messungEnde();
  661. zeit->messungStart();
  662. double z = zeit->getSekunden();
  663. ausgleich += TICK - z;
  664. if( ausgleich > 0 )
  665. Sleep( (int)( ausgleich * 1000 ) );
  666. rZeit += z;
  667. while( sZ + TICK < rZeit && !ende )
  668. {
  669. EnterCriticalSection( &cs );
  670. sZ += TICK;
  671. spielZeit++;
  672. char c = 0;
  673. log->schreibe( &c, 1 );
  674. tick( TICK );
  675. LeaveCriticalSection( &cs );
  676. }
  677. }
  678. zeit->messungEnde();
  679. zeit->release();
  680. for( int i = 0; i < spielerAnzahl; i++ )
  681. {
  682. if( spieler->z( i ) && spieler->z( i )->zKlient() )
  683. {
  684. if( spieler->z( i )->zTeam()->punkte < spieler->z( i )->zTeam()->maxPunkte )
  685. {
  686. spielerStatus.set( 1, i ); // Datenbank Verloren
  687. spieler->z( i )->zKlient()->sendeSpielEnde( 0, 0 );
  688. }
  689. else
  690. {
  691. spielerStatus.set( 2, i ); // Datenbank Gewonnen
  692. spieler->z( i )->zKlient()->sendeSpielEnde( 1, 0 );
  693. }
  694. }
  695. if( spieler->z( i ) && ( !spieler->z( i )->zKlient() || !spieler->z( i )->istOnline() ) )
  696. spielerStatus.set( 3, i );
  697. }
  698. if( teamAnzahl == 1 )
  699. psqldb->setSpielStatusBeendet( spielId, 6 );
  700. else
  701. psqldb->setSpielStatusBeendet( spielId, 5 );
  702. for( int i = 0; i < spielerAnzahl; i++ )
  703. {
  704. Spieler *tmp = spieler->z( i );
  705. if( tmp )
  706. {
  707. psqldb->setSpielSpielerStatus( spielId, tmp->getAccountId(), tmp->getPunkte(), spielerStatus.get( i ) );
  708. if( teamAnzahl > 1 )
  709. psqldb->addSpielerStatistik( tmp->getAccountId(), spielId );
  710. }
  711. }
  712. log->close();
  713. log = log->release();
  714. isRunning = 0;
  715. }
  716. // constant
  717. StatistikV *Spiel::getStatistik() const
  718. {
  719. return stat->getThis();
  720. }
  721. // Reference Counting
  722. SpielKlasse *Spiel::getThis()
  723. {
  724. ref++;
  725. return this;
  726. }
  727. SpielKlasse *Spiel::release()
  728. {
  729. ref--;
  730. if( !ref )
  731. delete this;
  732. return 0;
  733. }