SpielStatistik.cpp 8.3 KB

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