SpielStatistik.cpp 7.3 KB

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