SpielStatistik.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  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< SSDSpieler* >();
  23. gts = new Array< SSDTeam* >();
  24. chat = 0;
  25. tabelle = 0;
  26. accountId = 0;
  27. rend = 0;
  28. ref = 1;
  29. }
  30. // Destruktor
  31. SpielStatistik::~SpielStatistik()
  32. {
  33. if( chat )
  34. chat->release();
  35. if( tabelle )
  36. tabelle->release();
  37. if( schrift )
  38. schrift->release();
  39. if( screen )
  40. screen->release();
  41. if( infoc )
  42. infoc->release();
  43. if( spielc )
  44. spielc->release();
  45. int anz = gss->getEintragAnzahl();
  46. for( int i = 0; i < anz; i++ )
  47. {
  48. if( gss->hat( i ) )
  49. delete gss->get( i );
  50. }
  51. gss->release();
  52. anz = gts->getEintragAnzahl();
  53. for( int i = 0; i < anz; i++ )
  54. {
  55. if( gts->hat( i ) )
  56. delete gts->get( i );
  57. }
  58. gts->release();
  59. DeleteCriticalSection( &cs );
  60. }
  61. // nicht constant
  62. void SpielStatistik::lock()
  63. {
  64. EnterCriticalSection( &cs );
  65. }
  66. void SpielStatistik::unlock()
  67. {
  68. LeaveCriticalSection( &cs );
  69. }
  70. void SpielStatistik::bereit()
  71. {
  72. char byte = 0;
  73. spielc->statistikNachricht( 1, &byte );
  74. }
  75. void SpielStatistik::setBilder( BilderV *b )
  76. {
  77. bilder = b;
  78. }
  79. void SpielStatistik::setAccountId( int id )
  80. {
  81. accountId = id;
  82. }
  83. void SpielStatistik::setRückrufFunktionen( void( *addNachrichtF )( void *, Text *, Text *, Text *, Text * ),
  84. void( *addChatF )( void *, int ), void( *addFreundF )( void *, int ),
  85. void( *accountAnsehenF )( void *, int ), bool( *istFreundF )( void *, int ), void *nachrichtParam )
  86. {
  87. this->addNachrichtF = addNachrichtF;
  88. this->addChatF = addChatF;
  89. this->addFreundF = addFreundF;
  90. this->accountAnsehenF = accountAnsehenF;
  91. this->istFreundF = istFreundF;
  92. this->nachrichtParam = nachrichtParam;
  93. }
  94. void SpielStatistik::setSchrift( Schrift *schrift )
  95. {
  96. if( this->schrift )
  97. this->schrift->release();
  98. this->schrift = schrift;
  99. }
  100. void SpielStatistik::setBildschirm( Bildschirm *screen )
  101. {
  102. if( this->screen )
  103. this->screen->release();
  104. this->screen = screen;
  105. }
  106. void SpielStatistik::setKlients( KSGClient::InformationServerClient *infoc, KSGClient::SpielServerClient *spielc )
  107. {
  108. if( this->infoc )
  109. this->infoc->release();
  110. if( this->spielc )
  111. this->spielc->release();
  112. this->infoc = infoc;
  113. this->spielc = spielc;
  114. }
  115. void SpielStatistik::nachricht( int län, char *bytes )
  116. {
  117. lock();
  118. char num = *bytes;
  119. bytes++;
  120. län--;
  121. switch( num )
  122. {
  123. case 0: // Spieler Statistik
  124. if( 1 )
  125. {
  126. SSDSpieler *ssdgs = new SSDSpieler();
  127. ssdgs->spielerNummer = *(int*)bytes;
  128. bytes += 4;
  129. län -= 4;
  130. char snlän = *bytes;
  131. län--;
  132. bytes++;
  133. char *txt = new char[ snlän + 1 ];
  134. txt[ snlän ] = 0;
  135. for( int i = 0; i < snlän; i++ )
  136. txt[ i ] = bytes[ i ];
  137. bytes += snlän;
  138. län -= snlän;
  139. ssdgs->spielerName = txt;
  140. delete[] txt;
  141. char tnlän = *bytes;
  142. län--;
  143. bytes++;
  144. txt = new char[ tnlän + 1 ];
  145. txt[ tnlän ] = 0;
  146. for( int i = 0; i < tnlän; i++ )
  147. txt[ i ] = bytes[ i ];
  148. bytes += tnlän;
  149. län -= tnlän;
  150. ssdgs->teamName = txt;
  151. delete[] txt;
  152. ssdgs->spielerFarbe = *(int*)bytes;
  153. bytes += 4;
  154. län -= 4;
  155. ssdgs->teamFarbe = *(int*)bytes;
  156. bytes += 4;
  157. län -= 4;
  158. ssdgs->schadenBekommen = *(int*)bytes;
  159. bytes += 4;
  160. län -= 4;
  161. ssdgs->schadenGemacht = *(int*)bytes;
  162. bytes += 4;
  163. län -= 4;
  164. ssdgs->treibstoffVerbraucht = *(int*)bytes;
  165. bytes += 4;
  166. län -= 4;
  167. ssdgs->schüsse = *(int*)bytes;
  168. bytes += 4;
  169. län -= 4;
  170. ssdgs->treffer = *(int*)bytes;
  171. bytes += 4;
  172. län -= 4;
  173. ssdgs->punkte = *(int*)bytes;
  174. bytes += 4;
  175. län -= 4;
  176. ssdgs->kills = *(int*)bytes;
  177. bytes += 4;
  178. län -= 4;
  179. ssdgs->tode = *(int*)bytes;
  180. bytes += 4;
  181. län -= 4;
  182. ssdgs->zeitAmLeben = *(int*)bytes;
  183. bytes += 4;
  184. län -= 4;
  185. ssdgs->zeitTod = *(int*)bytes;
  186. bytes += 4;
  187. län -= 4;
  188. gss->add( ssdgs );
  189. }
  190. break;
  191. case 1: // Team Statistik
  192. if( 1 )
  193. {
  194. SSDTeam *ssdgt = new SSDTeam();
  195. ssdgt->teamNummer = *(int*)bytes;
  196. bytes += 4;
  197. län -= 4;
  198. char tnlän = *bytes;
  199. län--;
  200. bytes++;
  201. char *txt = new char[ tnlän + 1 ];
  202. txt[ tnlän ] = 0;
  203. for( int i = 0; i < tnlän; i++ )
  204. txt[ i ] = bytes[ i ];
  205. bytes += tnlän;
  206. län -= tnlän;
  207. ssdgt->teamName = txt;
  208. delete[] txt;
  209. ssdgt->teamFarbe = *(int*)bytes;
  210. bytes += 4;
  211. län -= 4;
  212. ssdgt->schadenBekommen = *(int*)bytes;
  213. bytes += 4;
  214. län -= 4;
  215. ssdgt->schadenGemacht = *(int*)bytes;
  216. bytes += 4;
  217. län -= 4;
  218. ssdgt->treibstoffVerbraucht = *(int*)bytes;
  219. bytes += 4;
  220. län -= 4;
  221. ssdgt->schüsse = *(int*)bytes;
  222. bytes += 4;
  223. län -= 4;
  224. ssdgt->treffer = *(int*)bytes;
  225. bytes += 4;
  226. län -= 4;
  227. ssdgt->punkte = *(int*)bytes;
  228. bytes += 4;
  229. län -= 4;
  230. ssdgt->kills = *(int*)bytes;
  231. bytes += 4;
  232. län -= 4;
  233. ssdgt->tode = *(int*)bytes;
  234. bytes += 4;
  235. län -= 4;
  236. ssdgt->gewonnen = *bytes != 0;
  237. bytes++;
  238. län--;
  239. gts->add( ssdgt );
  240. }
  241. break;
  242. case 2: // Ladevorgang abgeschlossen
  243. if( 1 )
  244. {
  245. chat = new StatistikChat( accountId, spielc->getThis(), infoc->getThis(), schrift->getThis(), bilder, addNachrichtF, addChatF, addFreundF, accountAnsehenF, nachrichtParam );
  246. int anz = gss->getEintragAnzahl();
  247. for( int i = 0; i < anz; i++ )
  248. {
  249. if( gss->hat( i ) )
  250. {
  251. int acc = infoc->getAccountId( gss->get( i )->spielerName );
  252. if( acc )
  253. chat->addSpieler( acc, istFreundF( nachrichtParam, acc ) || acc == accountId );
  254. }
  255. }
  256. tabelle = new StatistikTabelle( gss->getThis(), gts->getThis(), schrift, screen );
  257. status = 1;
  258. }
  259. break;
  260. case 3: // Chat Nachricht
  261. if( 1 )
  262. {
  263. int vonAccount = *(int*)bytes;
  264. bytes += 4;
  265. län -= 4;
  266. char *txt = new char[ län + 1 ];
  267. txt[ län ] = 0;
  268. for( int i = 0; i < län; i++ )
  269. txt[ i ] = bytes[ i ];
  270. if( status == 1 )
  271. chat->addChatNachricht( vonAccount, txt );
  272. delete[] txt;
  273. }
  274. break;
  275. case 4: // Spieler hat verlassen
  276. if( 1 )
  277. {
  278. int acc = *(int*)bytes;
  279. bytes += 4;
  280. län -= 4;
  281. if( status == 1 )
  282. chat->spielerOffline( acc );
  283. }
  284. break;
  285. default:
  286. // Fehler
  287. break;
  288. }
  289. if( län != 0 )
  290. {
  291. // Fehler
  292. }
  293. unlock();
  294. }
  295. void SpielStatistik::doMausEreignis( MausEreignis &me )
  296. {
  297. if( !status )
  298. return;
  299. lock();
  300. if( status == 1 )
  301. {
  302. tabelle->doMausEreignis( me );
  303. chat->doMausEreignis( me );
  304. }
  305. unlock();
  306. }
  307. void SpielStatistik::doTastaturEreignis( TastaturEreignis &te )
  308. {
  309. if( !status )
  310. return;
  311. lock();
  312. if( status == 1 )
  313. chat->doTastaturEreignis( te );
  314. unlock();
  315. }
  316. bool SpielStatistik::tick( double zeit )
  317. {
  318. if( !status )
  319. return 0;
  320. lock();
  321. if( status == 1 )
  322. {
  323. rend |= chat->tick( zeit );
  324. rend |= tabelle->tick( zeit );
  325. if( chat->hatVerlassen() && status == 1 )
  326. {
  327. spielc->trenne();
  328. status = 2;
  329. }
  330. }
  331. bool ret = rend;
  332. rend = 0;
  333. unlock();
  334. return ret;
  335. }
  336. void SpielStatistik::render( Bild &zRObj )
  337. {
  338. if( !status )
  339. return;
  340. lock();
  341. chat->render( zRObj );
  342. tabelle->render( zRObj );
  343. unlock();
  344. }
  345. void SpielStatistik::verlassen()
  346. {
  347. if( spielc )
  348. spielc->trenne();
  349. status = 2;
  350. }
  351. // constant
  352. int SpielStatistik::getStatus() const // 0 = laden, 1 = läuft, 2 = fortsetzen
  353. {
  354. return status;
  355. }
  356. // Reference Counting
  357. SpielStatistikV *SpielStatistik::getThis()
  358. {
  359. ref++;
  360. return this;
  361. }
  362. SpielStatistikV *SpielStatistik::release()
  363. {
  364. ref--;
  365. if( !ref )
  366. delete this;
  367. return 0;
  368. }