SpielStatistik.cpp 15 KB

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