SpielStatistik.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. #include "SpielStatistik.h"
  2. #include "../Initialisierung/Initialisierung.h"
  3. #include <MausEreignis.h>
  4. #include <Punkt.h>
  5. // Inhalt der SpielStatistik Klasse aus SpielStatistik.h
  6. // Konstruktor
  7. SpielStatistik::SpielStatistik()
  8. {
  9. InitializeCriticalSection( &cs );
  10. addNachrichtF = 0;
  11. addChatF = 0;
  12. addFreundF = 0;
  13. accountAnsehenF = 0;
  14. istFreundF = 0;
  15. nachrichtParam = 0;
  16. bilder = 0;
  17. schrift = 0;
  18. screen = 0;
  19. infoc = 0;
  20. spielc = 0;
  21. status = 0;
  22. gss = new Array< SSDGesamtSpieler* >();
  23. gts = new Array< SSDGesamtTeam* >();
  24. rs = new Array< SSDRunde* >();
  25. chat = 0;
  26. runde = 0;
  27. tabelle = 0;
  28. accountId = 0;
  29. rend = 0;
  30. ref = 1;
  31. }
  32. // Destruktor
  33. SpielStatistik::~SpielStatistik()
  34. {
  35. if( chat )
  36. chat->release();
  37. if( runde )
  38. runde->release();
  39. if( tabelle )
  40. tabelle->release();
  41. if( schrift )
  42. schrift->release();
  43. if( infoc )
  44. infoc->release();
  45. if( spielc )
  46. spielc->release();
  47. int anz = gss->getEintragAnzahl();
  48. for( int i = 0; i < anz; i++ )
  49. {
  50. if( gss->hat( i ) )
  51. delete gss->get( i );
  52. }
  53. gss->release();
  54. anz = gts->getEintragAnzahl();
  55. for( int i = 0; i < anz; i++ )
  56. {
  57. if( gts->hat( i ) )
  58. delete gts->get( i );
  59. }
  60. gts->release();
  61. anz = rs->getEintragAnzahl();
  62. for( int i = 0; i < anz; i++ )
  63. {
  64. if( rs->hat( i ) )
  65. {
  66. int anz2 = rs->get( i )->spieler.getEintragAnzahl();
  67. for( int j = 0; j < anz2; j++ )
  68. {
  69. if( rs->get( i )->spieler.hat( j ) )
  70. delete rs->get( i )->spieler.get( j );
  71. }
  72. anz2 = rs->get( i )->teams.getEintragAnzahl();
  73. for( int j = 0; j < anz2; j++ )
  74. {
  75. if( rs->get( i )->teams.hat( j ) )
  76. delete rs->get( i )->teams.get( j );
  77. }
  78. delete rs->get( i );
  79. }
  80. }
  81. rs->release();
  82. DeleteCriticalSection( &cs );
  83. }
  84. // nicht constant
  85. void SpielStatistik::lock()
  86. {
  87. EnterCriticalSection( &cs );
  88. }
  89. void SpielStatistik::unlock()
  90. {
  91. LeaveCriticalSection( &cs );
  92. }
  93. void SpielStatistik::bereit()
  94. {
  95. char byte = 1;
  96. spielc->statistikNachricht( 1, &byte );
  97. }
  98. void SpielStatistik::setBilder( BilderV *b )
  99. {
  100. bilder = b;
  101. }
  102. void SpielStatistik::setAccountId( int id )
  103. {
  104. accountId = id;
  105. }
  106. void SpielStatistik::setRückrufFunktionen( void( *addNachrichtF )( void *, Text *, Text *, Text *, Text * ),
  107. void( *addChatF )( void *, int ), void( *addFreundF )( void *, int ),
  108. void( *accountAnsehenF )( void *, int ), bool( *istFreundF )( void *, int ), void *nachrichtParam )
  109. {
  110. this->addNachrichtF = addNachrichtF;
  111. this->addChatF = addChatF;
  112. this->addFreundF = addFreundF;
  113. this->accountAnsehenF = accountAnsehenF;
  114. this->istFreundF = istFreundF;
  115. this->nachrichtParam = nachrichtParam;
  116. }
  117. void SpielStatistik::setSchrift( Schrift *schrift )
  118. {
  119. if( this->schrift )
  120. this->schrift->release();
  121. this->schrift = schrift;
  122. }
  123. void SpielStatistik::setBildschirm( Bildschirm *zScreen )
  124. {
  125. screen = zScreen;
  126. }
  127. void SpielStatistik::setKlients( KSGClient::InformationServerClient *infoc, KSGClient::SpielServerClient *spielc )
  128. {
  129. if( this->infoc )
  130. this->infoc->release();
  131. if( this->spielc )
  132. this->spielc->release();
  133. this->infoc = infoc;
  134. this->spielc = spielc;
  135. }
  136. void SpielStatistik::nachricht( int län, char *bytes )
  137. {
  138. lock();
  139. char num = *bytes;
  140. bytes++;
  141. län--;
  142. switch( num )
  143. {
  144. case 1: // Ladevorgang abgeschlossen
  145. if( 1 )
  146. {
  147. chat = new StatistikChat( accountId, spielc->getThis(), infoc->getThis(), schrift->getThis(), bilder, addNachrichtF, addChatF, addFreundF, accountAnsehenF, nachrichtParam );
  148. int anz = gss->getEintragAnzahl();
  149. for( int i = 0; i < anz; i++ )
  150. {
  151. if( gss->hat( i ) )
  152. {
  153. int acc = infoc->getAccountId( gss->get( i )->spielerName );
  154. if( acc )
  155. chat->addSpieler( acc, istFreundF( nachrichtParam, acc ) || acc == accountId );
  156. }
  157. }
  158. runde = new StatistikRunde( schrift, rs->getThis() );
  159. tabelle = new StatistikTabelle( gss->getThis(), gts->getThis(), rs->getThis(), schrift, screen );
  160. status = 1;
  161. }
  162. break;
  163. case 2: // Gesammt Spieler Statistik
  164. if( 1 )
  165. {
  166. SSDGesamtSpieler *ssdgs = new SSDGesamtSpieler();
  167. ssdgs->spielerNummer = *(int*)bytes;
  168. bytes += 4;
  169. län -= 4;
  170. char snlän = *bytes;
  171. län--;
  172. bytes++;
  173. char *txt = new char[ snlän + 1 ];
  174. txt[ snlän ] = 0;
  175. for( int i = 0; i < snlän; i++ )
  176. txt[ i ] = bytes[ i ];
  177. bytes += snlän;
  178. län -= snlän;
  179. ssdgs->spielerName = txt;
  180. delete[] txt;
  181. char tnlän = *bytes;
  182. län--;
  183. bytes++;
  184. txt = new char[ tnlän + 1 ];
  185. txt[ tnlän ] = 0;
  186. for( int i = 0; i < tnlän; i++ )
  187. txt[ i ] = bytes[ i ];
  188. bytes += tnlän;
  189. län -= tnlän;
  190. ssdgs->teamName = txt;
  191. delete[] txt;
  192. ssdgs->spielerFarbe = *(int*)bytes;
  193. bytes += 4;
  194. län -= 4;
  195. ssdgs->teamFarbe = *(int*)bytes;
  196. bytes += 4;
  197. län -= 4;
  198. ssdgs->gewonneneRunden = *(int*)bytes;
  199. bytes += 4;
  200. län -= 4;
  201. ssdgs->punkte = *(int*)bytes;
  202. bytes += 4;
  203. län -= 4;
  204. ssdgs->linienLänge = *(int*)bytes;
  205. bytes += 4;
  206. län -= 4;
  207. ssdgs->zeitAmLeben = *(int*)bytes;
  208. bytes += 4;
  209. län -= 4;
  210. ssdgs->zeitTod = *(int*)bytes;
  211. bytes += 4;
  212. län -= 4;
  213. ssdgs->kills = *(int*)bytes;
  214. bytes += 4;
  215. län -= 4;
  216. ssdgs->tode = *(int*)bytes;
  217. bytes += 4;
  218. län -= 4;
  219. gss->add( ssdgs );
  220. }
  221. break;
  222. case 3: // Gesammt Team Statistik
  223. if( 1 )
  224. {
  225. SSDGesamtTeam *ssdgt = new SSDGesamtTeam();
  226. ssdgt->teamNummer = *(int*)bytes;
  227. bytes += 4;
  228. län -= 4;
  229. char tnlän = *bytes;
  230. län--;
  231. bytes++;
  232. char *txt = new char[ tnlän + 1 ];
  233. txt[ tnlän ] = 0;
  234. for( int i = 0; i < tnlän; i++ )
  235. txt[ i ] = bytes[ i ];
  236. bytes += tnlän;
  237. län -= tnlän;
  238. ssdgt->teamName = txt;
  239. delete[] txt;
  240. ssdgt->teamFarbe = *(int*)bytes;
  241. bytes += 4;
  242. län -= 4;
  243. ssdgt->gewonneneRunden = *(int*)bytes;
  244. bytes += 4;
  245. län -= 4;
  246. ssdgt->punkte = *(int*)bytes;
  247. bytes += 4;
  248. län -= 4;
  249. ssdgt->linienLänge = *(int*)bytes;
  250. bytes += 4;
  251. län -= 4;
  252. ssdgt->kills = *(int*)bytes;
  253. bytes += 4;
  254. län -= 4;
  255. ssdgt->tode = *(int*)bytes;
  256. bytes += 4;
  257. län -= 4;
  258. gts->add( ssdgt );
  259. }
  260. break;
  261. case 4: // Runde Statistik
  262. if( 1 )
  263. {
  264. SSDRunde *ssdr = new SSDRunde();
  265. ssdr->rundenNummer = *(int*)bytes;
  266. bytes += 4;
  267. län -= 4;
  268. ssdr->rundenDauer = *(int*)bytes;
  269. bytes += 4;
  270. län -= 4;
  271. ssdr->rundenSieger = *(int*)bytes;
  272. bytes += 4;
  273. län -= 4;
  274. ssdr->spielfeldNutzung = *(int*)bytes;
  275. bytes += 4;
  276. län -= 4;
  277. int breite = *(int*)bytes;
  278. bytes += 4;
  279. län -= 4;
  280. int höhe = *(int*)bytes;
  281. bytes += 4;
  282. län -= 4;
  283. ssdr->rundenBild.neuBild( breite, höhe, 0 );
  284. rs->add( ssdr );
  285. }
  286. break;
  287. case 5: // Runde Bild
  288. if( 1 )
  289. {
  290. int runde = *(int*)bytes;
  291. bytes += 4;
  292. län -= 4;
  293. int *buff = 0;
  294. int max = 0;
  295. int anz = rs->getEintragAnzahl();
  296. for( int i = 0; i < anz; i++ )
  297. {
  298. if( rs->hat( i ) && rs->get( i )->rundenNummer == runde )
  299. {
  300. buff = rs->get( i )->rundenBild.getBuffer();
  301. max = rs->get( i )->rundenBild.getBreite() * rs->get( i )->rundenBild.getHeight();
  302. break;
  303. }
  304. }
  305. if( !buff )
  306. break;
  307. int index = *(int*)bytes;
  308. bytes += 4;
  309. län -= 4;
  310. int plän = *(int*)bytes;
  311. bytes += 4;
  312. län -= 4;
  313. for( int i = 0; i < plän; i++ )
  314. {
  315. if( index + i >= max )
  316. break;
  317. buff[ index + i ] = *(int*)bytes;
  318. bytes += 4;
  319. län -= 4;
  320. }
  321. }
  322. break;
  323. case 6: // Runde Spieler Statistik
  324. if( 1 )
  325. {
  326. int runde = *(int*)bytes;
  327. bytes += 4;
  328. län -= 4;
  329. int anz = rs->getEintragAnzahl();
  330. for( int i = 0; i < anz; i++ )
  331. {
  332. if( rs->hat( i ) && rs->get( i )->rundenNummer == runde )
  333. {
  334. SSDRundeSpieler *ssdrs = new SSDRundeSpieler();
  335. ssdrs->spielerNummer = *(int*)bytes;
  336. bytes += 4;
  337. län -= 4;
  338. char snlän = *bytes;
  339. län--;
  340. bytes++;
  341. char *txt = new char[ snlän + 1 ];
  342. txt[ snlän ] = 0;
  343. for( int j = 0; j < snlän; j++ )
  344. txt[ j ] = bytes[ j ];
  345. bytes += snlän;
  346. län -= snlän;
  347. ssdrs->spielerName = txt;
  348. delete[] txt;
  349. char tnlän = *bytes;
  350. län--;
  351. bytes++;
  352. txt = new char[ tnlän + 1 ];
  353. txt[ tnlän ] = 0;
  354. for( int j = 0; j < tnlän; j++ )
  355. txt[ j ] = bytes[ j ];
  356. bytes += tnlän;
  357. län -= tnlän;
  358. ssdrs->teamName = txt;
  359. delete[] txt;
  360. ssdrs->spielerFarbe = *(int*)bytes;
  361. bytes += 4;
  362. län -= 4;
  363. ssdrs->teamFarbe = *(int*)bytes;
  364. bytes += 4;
  365. län -= 4;
  366. ssdrs->linienLänge = *(int*)bytes;
  367. bytes += 4;
  368. län -= 4;
  369. ssdrs->kills = *(int*)bytes;
  370. bytes += 4;
  371. län -= 4;
  372. ssdrs->todesZeit = *(int*)bytes;
  373. bytes += 4;
  374. län -= 4;
  375. rs->get( i )->spieler.add( ssdrs );
  376. break;
  377. }
  378. }
  379. }
  380. break;
  381. case 7: // Runde Team Statistik
  382. if( 1 )
  383. {
  384. int runde = *(int*)bytes;
  385. bytes += 4;
  386. län -= 4;
  387. int anz = rs->getEintragAnzahl();
  388. for( int i = 0; i < anz; i++ )
  389. {
  390. if( rs->hat( i ) && rs->get( i )->rundenNummer == runde )
  391. {
  392. SSDRundeTeam *ssdrt = new SSDRundeTeam();
  393. ssdrt->teamNummer = *(int*)bytes;
  394. bytes += 4;
  395. län -= 4;
  396. char tnlän = *bytes;
  397. län--;
  398. bytes++;
  399. char *txt = new char[ tnlän + 1 ];
  400. txt[ tnlän ] = 0;
  401. for( int j = 0; j < tnlän; j++ )
  402. txt[ j ] = bytes[ j ];
  403. bytes += tnlän;
  404. län -= tnlän;
  405. ssdrt->teamName = txt;
  406. delete[] txt;
  407. ssdrt->teamFarbe = *(int*)bytes;
  408. bytes += 4;
  409. län -= 4;
  410. ssdrt->ergebnis = *bytes;
  411. bytes++;
  412. län--;
  413. ssdrt->linienLänge = *(int*)bytes;
  414. bytes += 4;
  415. län -= 4;
  416. ssdrt->kills = *(int*)bytes;
  417. bytes += 4;
  418. län -= 4;
  419. ssdrt->tode = *(int*)bytes;
  420. bytes += 4;
  421. län -= 4;
  422. rs->get( i )->teams.add( ssdrt );
  423. break;
  424. }
  425. }
  426. }
  427. break;
  428. case 8: // Chat Nachricht
  429. if( 1 )
  430. {
  431. int vonAccount = *(int*)bytes;
  432. bytes += 4;
  433. län -= 4;
  434. char *txt = new char[ län + 1 ];
  435. txt[ län ] = 0;
  436. for( int i = 0; i < län; i++ )
  437. txt[ i ] = bytes[ i ];
  438. if( status == 1 )
  439. chat->addChatNachricht( vonAccount, txt );
  440. delete[] txt;
  441. }
  442. break;
  443. case 9: // Spieler hat verlassen
  444. if( 1 )
  445. {
  446. int acc = *(int*)bytes;
  447. bytes += 4;
  448. län -= 4;
  449. if( status == 1 )
  450. chat->spielerOffline( acc );
  451. }
  452. break;
  453. default:
  454. // Fehler
  455. break;
  456. }
  457. if( län != 0 )
  458. {
  459. // Fehler
  460. }
  461. unlock();
  462. }
  463. void SpielStatistik::doMausEreignis( MausEreignis &me )
  464. {
  465. if( !status )
  466. return;
  467. lock();
  468. if( status == 1 )
  469. {
  470. tabelle->doMausEreignis( me );
  471. runde->doMausEreignis( me );
  472. chat->doMausEreignis( me );
  473. }
  474. unlock();
  475. }
  476. void SpielStatistik::doTastaturEreignis( TastaturEreignis &te )
  477. {
  478. if( !status )
  479. return;
  480. lock();
  481. if( status == 1 )
  482. chat->doTastaturEreignis( te );
  483. unlock();
  484. }
  485. bool SpielStatistik::tick( double zeit )
  486. {
  487. if( !status )
  488. return 0;
  489. lock();
  490. if( status == 1 )
  491. {
  492. rend |= chat->tick( zeit );
  493. rend |= runde->tick( zeit );
  494. rend |= tabelle->tick( zeit );
  495. if( ( chat->hatVerlassen() || runde->mussVerlassen() ) && status == 1 )
  496. {
  497. spielc->trenne();
  498. status = 2;
  499. }
  500. runde->setRunde( tabelle->getRunde() );
  501. }
  502. bool ret = rend;
  503. rend = 0;
  504. unlock();
  505. return ret;
  506. }
  507. void SpielStatistik::render( Bild &zRObj )
  508. {
  509. if( !status )
  510. return;
  511. lock();
  512. chat->render( zRObj );
  513. runde->render( zRObj );
  514. tabelle->render( zRObj );
  515. unlock();
  516. }
  517. void SpielStatistik::verlassen()
  518. {
  519. if( spielc )
  520. spielc->trenne();
  521. status = 2;
  522. }
  523. // constant
  524. int SpielStatistik::getStatus() const // 0 = laden, 1 = läuft, 2 = fortsetzen
  525. {
  526. return status;
  527. }
  528. // Reference Counting
  529. SpielStatistikV *SpielStatistik::getThis()
  530. {
  531. ref++;
  532. return this;
  533. }
  534. SpielStatistikV *SpielStatistik::release()
  535. {
  536. ref--;
  537. if( !ref )
  538. delete this;
  539. return 0;
  540. }