SpielStatistik.cpp 8.6 KB

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