StatistikLeser.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. #include "StatistikLeser.h"
  2. // Inhalt der StatistikLeser Klasse aus StatistikLeser.h
  3. // Konstruktor
  4. StatistikLeser::StatistikLeser( int spielId )
  5. {
  6. nachrichten = new SpielNachricht( spielId );
  7. bestenliste = new VideoBestenliste( 0 );
  8. map = new VideoKarte();
  9. spieler = new RCArray< VideoSpieler >();
  10. ssdgs = new Array< SSDGesamtSpieler* >();
  11. ssdgt = new Array< SSDGesamtTeam* >();
  12. ssdr = new Array< SSDRunde* >();
  13. spielerAnzahl = 0;
  14. teamAnzahl = 0;
  15. rundenAnzahl = 0;
  16. ref = 1;
  17. Text f;
  18. fehler = nachrichten->hatFehler( &f );
  19. if( fehler )
  20. return;
  21. // Spiel Initialisieren
  22. spielerAnzahl = nachrichten->getSVD()->spielerAnzahl;
  23. teamAnzahl = nachrichten->getTeamAnzahl();
  24. int maxTeam = 0;
  25. for( int i = 0; i < spielerAnzahl; i++ )
  26. {
  27. SpielerVideoDaten *dat = nachrichten->getSPVD( i );
  28. VideoSpieler *tmp = new VideoSpieler( dat );
  29. bestenliste->addSpieler( tmp );
  30. spieler->set( tmp, i );
  31. maxTeam = maxTeam < dat->team ? dat->team : maxTeam;
  32. }
  33. maxTeam++;
  34. bestenliste->setTeamAnzahl( maxTeam );
  35. for( int i = 0; i < nachrichten->getTeamAnzahl(); i++ )
  36. {
  37. TeamVideoDaten *dat = nachrichten->getTVD( i );
  38. bestenliste->setTeamMaxPunkte( dat->teamNummer, dat->maxPunkte );
  39. bestenliste->setTeamPunkte( dat->teamNummer, dat->punkte );
  40. }
  41. RundeVideoDaten *rDat = nachrichten->getRVD();
  42. map->setSize( rDat->mapBreite, rDat->mapHöhe );
  43. for( int i = 0; i < spielerAnzahl; i++ )
  44. {
  45. RundeSpielerVideoDaten *dat = nachrichten->getRSVD( i );
  46. spieler->z( i )->neuRunde( 1, dat, 1 );
  47. }
  48. Array< int > rundenSieger;
  49. Array< int > rundenDauer;
  50. VideoMSG *nMsg = 0;
  51. double sZeit = 0;
  52. // Spiel nachstellen
  53. while( 1 )
  54. {
  55. while( !nMsg || nMsg->typ )
  56. {
  57. if( !nMsg )
  58. nMsg = nachrichten->GetNextNachricht();
  59. if( !nMsg )
  60. break;
  61. if( !nMsg->typ )
  62. break;
  63. VideoAktionMSG *ak = (VideoAktionMSG*)nMsg;
  64. switch( ak->aktion )
  65. {
  66. case 0: // T_Links Press
  67. for( int i = 0; i < spielerAnzahl; i++ )
  68. {
  69. if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
  70. {
  71. spieler->z( i )->setLinksKurve( 1 );
  72. break;
  73. }
  74. }
  75. break;
  76. case 1: // T_Links Release
  77. for( int i = 0; i < spielerAnzahl; i++ )
  78. {
  79. if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
  80. {
  81. spieler->z( i )->setLinksKurve( 0 );
  82. break;
  83. }
  84. }
  85. break;
  86. case 2: // T_Rechts Press
  87. for( int i = 0; i < spielerAnzahl; i++ )
  88. {
  89. if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
  90. {
  91. spieler->z( i )->setRechtsKurve( 1 );
  92. break;
  93. }
  94. }
  95. break;
  96. case 3: // T_Rechts Release
  97. for( int i = 0; i < spielerAnzahl; i++ )
  98. {
  99. if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
  100. {
  101. spieler->z( i )->setRechtsKurve( 0 );
  102. break;
  103. }
  104. }
  105. break;
  106. case 5: // Linien Unterbrechung
  107. if( 1 )
  108. {
  109. VideoLinieMSG *lMsg = (VideoLinieMSG*)ak;
  110. for( int i = 0; i < spielerAnzahl; i++ )
  111. {
  112. if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
  113. {
  114. spieler->z( i )->setLinienUnterbrechung( lMsg->unterbrechung != 0 );
  115. break;
  116. }
  117. }
  118. }
  119. break;
  120. }
  121. nMsg = 0;
  122. }
  123. if( !nMsg )
  124. break;
  125. sZeit += TICK;
  126. bool rEnd = 0;
  127. int tmpTeam = -1;
  128. for( int i = 0; i < spielerAnzahl; i++ )
  129. {
  130. VideoSpieler *tmp = spieler->z( i );
  131. if( tmp )
  132. {
  133. bool amLeben = tmp->istAmLeben();
  134. tmp->tick( map->zMap(), TICK );
  135. if( amLeben != tmp->istAmLeben() )
  136. {
  137. for( int j = 0; j < spielerAnzahl; j++ )
  138. {
  139. VideoSpieler *s = spieler->z( j );
  140. if( s && s->getFarbe() == tmp->getKillFarbe() )
  141. s->addKill();
  142. if( s && s != tmp && s->istAmLeben() )
  143. bestenliste->addPunkt( s->getTeam(), s->getSpielerNummer(), 1 );
  144. }
  145. }
  146. if( amLeben && !tmp->istAmLeben() )
  147. { // gestorben
  148. int team = tmp->getTeam();
  149. bool teamLebt = 0;
  150. for( int k = 0; k < spielerAnzahl; k++ )
  151. {
  152. if( spieler->z( k ) && spieler->z( k )->getTeam() == team )
  153. teamLebt |= spieler->z( k )->istAmLeben();
  154. }
  155. if( !teamLebt )
  156. {
  157. int teamAmLebenAnzahl = 0;
  158. for( int k = 0; k < maxTeam; k++ )
  159. {
  160. if( !bestenliste->teamExistiert( k ) )
  161. continue;
  162. bool amLeben = 0;
  163. for( int l = 0; l < spielerAnzahl; l++ )
  164. {
  165. if( spieler->z( l ) && spieler->z( l )->getTeam() == k )
  166. amLeben |= spieler->z( l )->istAmLeben();
  167. }
  168. if( amLeben )
  169. {
  170. tmpTeam = k;
  171. teamAmLebenAnzahl++;
  172. bestenliste->addPunkt( k, 1 );
  173. }
  174. else
  175. bestenliste->addPunkt( k, 0 );
  176. if( !bestenliste->getTeamPunkte( k ) )
  177. bestenliste->setTeamStatus( k, "tod", 0xFFFF0000 );
  178. }
  179. if( teamAmLebenAnzahl <= 1 )
  180. rEnd = 1;
  181. }
  182. }
  183. }
  184. }
  185. if( rEnd )
  186. { // Runden Ende
  187. rundenSieger.set( tmpTeam, rundenAnzahl );
  188. rundenDauer.set( (int)sZeit, rundenAnzahl );
  189. rundenAnzahl++;
  190. sZeit = 0;
  191. int nAnz = 0;
  192. int nAnz2 = 0;
  193. for( int i = 0; i < maxTeam; i++ )
  194. {
  195. if( bestenliste->teamExistiert( i ) )
  196. {
  197. nAnz += bestenliste->hatTeamGewonnen( i );
  198. nAnz2 += bestenliste->getTeamPunkte( i ) >= 0;
  199. }
  200. }
  201. if( nAnz || nAnz2 <= 1 || rundenAnzahl >= 10 )
  202. {
  203. RundeSpielerVideoDaten dat;
  204. for( int i = 0; i < spielerAnzahl; i++ )
  205. spieler->z( i )->neuRunde( 1, &dat, 1 );
  206. break; // Spiel Ende
  207. }
  208. int r = nachrichten->setRundenEnde( 1 );
  209. bestenliste->updatePunkte();
  210. map->nextRunde( 1 );
  211. RundeVideoDaten *dat = nachrichten->getRVD();
  212. map->setSize( dat->mapBreite, dat->mapHöhe );
  213. for( int i = 0; i < spielerAnzahl; i++ )
  214. spieler->z( i )->neuRunde( 1, nachrichten->getRSVD( i ), bestenliste->getTeamPunkte( spieler->z( i )->getTeam() ) != 0 );
  215. }
  216. nMsg = 0;
  217. }
  218. // Statistik erstellen
  219. for( int i = 0; i < spielerAnzahl; i++ )
  220. {
  221. SSDGesamtSpieler *ssdgs = new SSDGesamtSpieler();
  222. VideoSpieler *tmp = spieler->z( i );
  223. ssdgs->spielerNummer = tmp->getSpielerNummer();
  224. ssdgs->spielerName.setText( tmp->zName()->getText() );
  225. ssdgs->teamName.setText( tmp->zTeamName()->getText() );
  226. ssdgs->spielerFarbe = tmp->getFarbe();
  227. ssdgs->teamFarbe = tmp->getTeamFarbe();
  228. ssdgs->gewonneneRunden = tmp->getGewonneneRunden();
  229. ssdgs->punkte = bestenliste->getSpielerPunkte( tmp->getTeam(), tmp->getSpielerNummer() );
  230. ssdgs->linienLänge = tmp->getLinienLänge();
  231. ssdgs->zeitAmLeben = tmp->getZeitAmLeben();
  232. ssdgs->zeitTod = tmp->getZeitTod();
  233. ssdgs->kills = tmp->getKills();
  234. ssdgs->tode = tmp->getTode();
  235. this->ssdgs->set( ssdgs, i );
  236. }
  237. Array< int > teams;
  238. for( int i = 0; i < teamAnzahl; i++ )
  239. {
  240. for( int j = 0; j < spielerAnzahl; j++ )
  241. {
  242. if( teams.getWertIndex( spieler->z( j )->getTeam() ) < 0 )
  243. {
  244. teams.set( spieler->z( j )->getTeam(), i );
  245. break;
  246. }
  247. }
  248. if( teams.hat( i ) )
  249. {
  250. SSDGesamtTeam *ssdgt = new SSDGesamtTeam();
  251. ssdgt->teamNummer = teams.get( i );
  252. for( int j = 0; j < spielerAnzahl; j++ )
  253. {
  254. VideoSpieler *tmp = spieler->z( j );
  255. if( tmp->getTeam() == ssdgt->teamNummer )
  256. {
  257. ssdgt->teamName.setText( tmp->zTeamName()->getText() );
  258. ssdgt->teamFarbe = tmp->getTeamFarbe();
  259. break;
  260. }
  261. }
  262. ssdgt->gewonneneRunden = 0;
  263. for( int j = 0; j < rundenAnzahl; j++ )
  264. {
  265. if( rundenSieger.get( j ) == ssdgt->teamNummer )
  266. ssdgt->gewonneneRunden++;
  267. }
  268. ssdgt->punkte = 0;
  269. ssdgt->linienLänge = 0;
  270. ssdgt->kills = 0;
  271. ssdgt->tode = 0;
  272. for( int j = 0; j < spielerAnzahl; j++ )
  273. {
  274. VideoSpieler *tmp = spieler->z( j );
  275. if( tmp->getTeam() == ssdgt->teamNummer )
  276. {
  277. ssdgt->punkte += bestenliste->getSpielerPunkte( tmp->getTeam(), tmp->getSpielerNummer() );
  278. ssdgt->linienLänge += tmp->getLinienLänge();
  279. ssdgt->kills += tmp->getKills();
  280. ssdgt->tode += tmp->getTode();
  281. }
  282. }
  283. this->ssdgt->set( ssdgt, i );
  284. }
  285. }
  286. for( int i = 0; i < rundenAnzahl; i++ )
  287. {
  288. SSDRunde *ssdr = new SSDRunde();
  289. ssdr->rundenNummer = i;
  290. ssdr->rundenDauer = rundenDauer.get( i );
  291. ssdr->rundenSieger = rundenSieger.get( i );
  292. ssdr->rundenBild.neuBild( map->zMap( i )->getBreite(), map->zMap( i )->getHeight(), 0 );
  293. ssdr->rundenBild.drawBild( 0, 0, map->zMap( i )->getBreite(), map->zMap( i )->getHeight(), *map->zMap( i ) );
  294. ssdr->spielfeldNutzung = 0;
  295. int *rbBuff = ssdr->rundenBild.getBuffer();
  296. for( int j = 0; j < ssdr->rundenBild.getBreite() * ssdr->rundenBild.getHeight(); j++ )
  297. {
  298. if( rbBuff[ j ] )
  299. ssdr->spielfeldNutzung++;
  300. }
  301. ssdr->spielfeldNutzung = (int)( ( ssdr->spielfeldNutzung / ( (double)( ssdr->rundenBild.getBreite() * ssdr->rundenBild.getHeight() ) / 25 ) ) * 100 );
  302. for( int j = 0; j < spielerAnzahl; j++ )
  303. {
  304. VideoSpieler *tmp = spieler->z( j );
  305. SSDRundeSpieler *ssdrs = new SSDRundeSpieler();
  306. ssdrs->spielerNummer = tmp->getSpielerNummer();
  307. ssdrs->spielerName.setText( tmp->zName()->getText() );
  308. ssdrs->teamName.setText( tmp->zTeamName()->getText() );
  309. ssdrs->spielerFarbe = tmp->getFarbe();
  310. ssdrs->teamFarbe = tmp->getTeamFarbe();
  311. ssdrs->linienLänge = tmp->getLinienLänge( i );
  312. ssdrs->kills = tmp->getKills( i );
  313. ssdrs->todesZeit = tmp->getTodesZeit( i );
  314. ssdr->spieler.set( ssdrs, j );
  315. }
  316. for( int j = 0; j < teamAnzahl; j++ )
  317. {
  318. SSDRundeTeam *ssdrt = new SSDRundeTeam();
  319. ssdrt->teamNummer = teams.get( j );
  320. for( int k = 0; k < spielerAnzahl; k++ )
  321. {
  322. if( spieler->z( k )->getTeam() == ssdrt->teamNummer )
  323. {
  324. ssdrt->teamName.setText( spieler->z( k )->zTeamName()->getText() );
  325. ssdrt->teamFarbe = spieler->z( k )->getTeamFarbe();
  326. break;
  327. }
  328. }
  329. ssdrt->ergebnis = rundenSieger.get( i ) == ssdrt->teamNummer;
  330. ssdrt->linienLänge = 0;
  331. ssdrt->kills = 0;
  332. ssdrt->tode = 0;
  333. for( int k = 0; k < spielerAnzahl; k++ )
  334. {
  335. VideoSpieler *tmp = spieler->z( j );
  336. if( tmp->getTeam() == ssdrt->teamNummer )
  337. {
  338. ssdrt->linienLänge += tmp->getLinienLänge( i );
  339. ssdrt->kills += tmp->getKills( i );
  340. ssdrt->tode += tmp->getTodesZeit( i ) != 0;
  341. }
  342. }
  343. ssdr->teams.set( ssdrt, j );
  344. }
  345. this->ssdr->set( ssdr, i );
  346. }
  347. }
  348. // Destruktor
  349. StatistikLeser::~StatistikLeser()
  350. {
  351. nachrichten->release();
  352. bestenliste->release();
  353. map->release();
  354. spieler->release();
  355. ssdgs->release();
  356. ssdgt->release();
  357. ssdr->release();
  358. }
  359. // constant
  360. bool StatistikLeser::hatFehler() const
  361. {
  362. return fehler;
  363. }
  364. int StatistikLeser::getSpielerAnzahl() const
  365. {
  366. return spielerAnzahl;
  367. }
  368. int StatistikLeser::getTeamAnzahl() const
  369. {
  370. return teamAnzahl;
  371. }
  372. int StatistikLeser::getRundenAnzahl() const
  373. {
  374. return rundenAnzahl;
  375. }
  376. SSDGesamtSpieler *StatistikLeser::getSSDGS( int index ) const
  377. {
  378. return ssdgs->get( index );
  379. }
  380. SSDGesamtTeam *StatistikLeser::getSSDGT( int index ) const
  381. {
  382. return ssdgt->get( index );
  383. }
  384. SSDRunde *StatistikLeser::getSSDR( int runde ) const
  385. {
  386. return ssdr->get( runde );
  387. }
  388. // Reference Counting
  389. StatistikLeser *StatistikLeser::getThis()
  390. {
  391. ref++;
  392. return this;
  393. }
  394. StatistikLeser *StatistikLeser::release()
  395. {
  396. ref--;
  397. if( !ref )
  398. delete this;
  399. return 0;
  400. }