SpielStatistik.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. #include "SpielStatistik.h"
  2. #include <MausEreignis.h>
  3. #include <Punkt.h>
  4. // Inhalt der SpielStatistik Klasse aus SpielStatistik.h
  5. // Konstruktor
  6. SpielStatistik::SpielStatistik()
  7. : ReferenceCounter()
  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. infoc = 0;
  18. spielc = 0;
  19. status = 0;
  20. gss = new Array< SSDGesamtSpieler* >();
  21. gts = new Array< SSDGesamtTeam* >();
  22. rs = new Array< SSDRunde* >();
  23. chat = 0;
  24. runde = 0;
  25. tabelle = 0;
  26. accountId = 0;
  27. rend = 0;
  28. }
  29. // Destruktor
  30. SpielStatistik::~SpielStatistik()
  31. {
  32. if (chat)
  33. chat->release();
  34. if (runde)
  35. runde->release();
  36. if (tabelle)
  37. tabelle->release();
  38. if (infoc)
  39. infoc->release();
  40. if (spielc)
  41. spielc->release();
  42. int anz = gss->getEintragAnzahl();
  43. for (int i = 0; i < anz; i++)
  44. {
  45. if (gss->hat(i))
  46. delete gss->get(i);
  47. }
  48. gss->release();
  49. anz = gts->getEintragAnzahl();
  50. for (int i = 0; i < anz; i++)
  51. {
  52. if (gts->hat(i))
  53. delete gts->get(i);
  54. }
  55. gts->release();
  56. anz = rs->getEintragAnzahl();
  57. for (int i = 0; i < anz; i++)
  58. {
  59. if (rs->hat(i))
  60. {
  61. int anz2 = rs->get(i)->spieler.getEintragAnzahl();
  62. for (int j = 0; j < anz2; j++)
  63. {
  64. if (rs->get(i)->spieler.hat(j))
  65. delete rs->get(i)->spieler.get(j);
  66. }
  67. anz2 = rs->get(i)->teams.getEintragAnzahl();
  68. for (int j = 0; j < anz2; j++)
  69. {
  70. if (rs->get(i)->teams.hat(j))
  71. delete rs->get(i)->teams.get(j);
  72. }
  73. delete rs->get(i);
  74. }
  75. }
  76. rs->release();
  77. DeleteCriticalSection(&cs);
  78. }
  79. // nicht constant
  80. void SpielStatistik::lock()
  81. {
  82. EnterCriticalSection(&cs);
  83. }
  84. void SpielStatistik::unlock()
  85. {
  86. LeaveCriticalSection(&cs);
  87. }
  88. void SpielStatistik::bereit()
  89. {
  90. char byte = 1;
  91. spielc->statistikNachricht(1, &byte);
  92. }
  93. void SpielStatistik::setBilder(BilderV* b)
  94. {
  95. bilder = b;
  96. }
  97. void SpielStatistik::setAccountId(int id)
  98. {
  99. accountId = id;
  100. }
  101. void SpielStatistik::setRückrufFunktionen(void(*addNachrichtF)(void*, Text*, Text*, Text*, Text*),
  102. void(*addChatF)(void*, int), void(*addFreundF)(void*, int),
  103. void(*accountAnsehenF)(void*, int), bool(*istFreundF)(void*, int), void* nachrichtParam)
  104. {
  105. this->addNachrichtF = addNachrichtF;
  106. this->addChatF = addChatF;
  107. this->addFreundF = addFreundF;
  108. this->accountAnsehenF = accountAnsehenF;
  109. this->istFreundF = istFreundF;
  110. this->nachrichtParam = nachrichtParam;
  111. }
  112. void SpielStatistik::setUIFactory(UIInit& factory)
  113. {
  114. uiFactory = factory;
  115. }
  116. void SpielStatistik::setKlients(KSGClient::InformationServerClient* infoc, KSGClient::SpielServerClient* spielc)
  117. {
  118. if (this->infoc)
  119. this->infoc->release();
  120. if (this->spielc)
  121. this->spielc->release();
  122. this->infoc = infoc;
  123. this->spielc = spielc;
  124. }
  125. void SpielStatistik::nachricht(int län, const char* bytes)
  126. {
  127. lock();
  128. char num = *bytes;
  129. bytes++;
  130. län--;
  131. switch (num)
  132. {
  133. case 1: // Ladevorgang abgeschlossen
  134. if (1)
  135. {
  136. chat = new StatistikChat(accountId, dynamic_cast<KSGClient::SpielServerClient*>(spielc->getThis()), dynamic_cast<KSGClient::InformationServerClient*>(infoc->getThis()), uiFactory, bilder, addNachrichtF, addChatF, addFreundF, accountAnsehenF, nachrichtParam);
  137. int anz = gss->getEintragAnzahl();
  138. for (int i = 0; i < anz; i++)
  139. {
  140. if (gss->hat(i))
  141. {
  142. int acc = infoc->getAccountId(gss->get(i)->spielerName);
  143. if (acc)
  144. chat->addSpieler(acc, istFreundF(nachrichtParam, acc) || acc == accountId);
  145. }
  146. }
  147. runde = new StatistikRunde(uiFactory, dynamic_cast<Array<SSDRunde*> *>(rs->getThis()));
  148. tabelle = new StatistikTabelle(dynamic_cast<Array<SSDGesamtSpieler*> *>(gss->getThis()), dynamic_cast<Array<SSDGesamtTeam*> *>(gts->getThis()), dynamic_cast<Array<SSDRunde*> *>(rs->getThis()), uiFactory);
  149. status = 1;
  150. }
  151. break;
  152. case 2: // Gesammt Spieler Statistik
  153. if (1)
  154. {
  155. SSDGesamtSpieler* ssdgs = new SSDGesamtSpieler();
  156. ssdgs->spielerNummer = *(int*)bytes;
  157. bytes += 4;
  158. län -= 4;
  159. char snlän = *bytes;
  160. län--;
  161. bytes++;
  162. char* txt = new char[snlän + 1];
  163. txt[snlän] = 0;
  164. for (int i = 0; i < snlän; i++)
  165. txt[i] = bytes[i];
  166. bytes += snlän;
  167. län -= snlän;
  168. ssdgs->spielerName = txt;
  169. delete[] txt;
  170. char tnlän = *bytes;
  171. län--;
  172. bytes++;
  173. txt = new char[tnlän + 1];
  174. txt[tnlän] = 0;
  175. for (int i = 0; i < tnlän; i++)
  176. txt[i] = bytes[i];
  177. bytes += tnlän;
  178. län -= tnlän;
  179. ssdgs->teamName = txt;
  180. delete[] txt;
  181. ssdgs->spielerFarbe = *(int*)bytes;
  182. bytes += 4;
  183. län -= 4;
  184. ssdgs->teamFarbe = *(int*)bytes;
  185. bytes += 4;
  186. län -= 4;
  187. ssdgs->gewonneneRunden = *(int*)bytes;
  188. bytes += 4;
  189. län -= 4;
  190. ssdgs->punkte = *(int*)bytes;
  191. bytes += 4;
  192. län -= 4;
  193. ssdgs->linienLänge = *(int*)bytes;
  194. bytes += 4;
  195. län -= 4;
  196. ssdgs->zeitAmLeben = *(int*)bytes;
  197. bytes += 4;
  198. län -= 4;
  199. ssdgs->zeitTod = *(int*)bytes;
  200. bytes += 4;
  201. län -= 4;
  202. ssdgs->kills = *(int*)bytes;
  203. bytes += 4;
  204. län -= 4;
  205. ssdgs->tode = *(int*)bytes;
  206. bytes += 4;
  207. län -= 4;
  208. gss->add(ssdgs);
  209. }
  210. break;
  211. case 3: // Gesammt Team Statistik
  212. if (1)
  213. {
  214. SSDGesamtTeam* ssdgt = new SSDGesamtTeam();
  215. ssdgt->teamNummer = *(int*)bytes;
  216. bytes += 4;
  217. län -= 4;
  218. char tnlän = *bytes;
  219. län--;
  220. bytes++;
  221. char* txt = new char[tnlän + 1];
  222. txt[tnlän] = 0;
  223. for (int i = 0; i < tnlän; i++)
  224. txt[i] = bytes[i];
  225. bytes += tnlän;
  226. län -= tnlän;
  227. ssdgt->teamName = txt;
  228. delete[] txt;
  229. ssdgt->teamFarbe = *(int*)bytes;
  230. bytes += 4;
  231. län -= 4;
  232. ssdgt->gewonneneRunden = *(int*)bytes;
  233. bytes += 4;
  234. län -= 4;
  235. ssdgt->punkte = *(int*)bytes;
  236. bytes += 4;
  237. län -= 4;
  238. ssdgt->linienLänge = *(int*)bytes;
  239. bytes += 4;
  240. län -= 4;
  241. ssdgt->kills = *(int*)bytes;
  242. bytes += 4;
  243. län -= 4;
  244. ssdgt->tode = *(int*)bytes;
  245. bytes += 4;
  246. län -= 4;
  247. gts->add(ssdgt);
  248. }
  249. break;
  250. case 4: // Runde Statistik
  251. if (1)
  252. {
  253. SSDRunde* ssdr = new SSDRunde();
  254. ssdr->rundenNummer = *(int*)bytes;
  255. bytes += 4;
  256. län -= 4;
  257. ssdr->rundenDauer = *(int*)bytes;
  258. bytes += 4;
  259. län -= 4;
  260. ssdr->rundenSieger = *(int*)bytes;
  261. bytes += 4;
  262. län -= 4;
  263. ssdr->spielfeldNutzung = *(int*)bytes;
  264. bytes += 4;
  265. län -= 4;
  266. int breite = *(int*)bytes;
  267. bytes += 4;
  268. län -= 4;
  269. int höhe = *(int*)bytes;
  270. bytes += 4;
  271. län -= 4;
  272. ssdr->rundenBild.neuBild(breite, höhe, 0);
  273. rs->add(ssdr);
  274. }
  275. break;
  276. case 5: // Runde Bild
  277. if (1)
  278. {
  279. int runde = *(int*)bytes;
  280. bytes += 4;
  281. län -= 4;
  282. int* buff = 0;
  283. int max = 0;
  284. int anz = rs->getEintragAnzahl();
  285. for (int i = 0; i < anz; i++)
  286. {
  287. if (rs->hat(i) && rs->get(i)->rundenNummer == runde)
  288. {
  289. buff = rs->get(i)->rundenBild.getBuffer();
  290. max = rs->get(i)->rundenBild.getBreite() * rs->get(i)->rundenBild.getHeight();
  291. break;
  292. }
  293. }
  294. if (!buff)
  295. break;
  296. int index = *(int*)bytes;
  297. bytes += 4;
  298. län -= 4;
  299. int plän = *(int*)bytes;
  300. bytes += 4;
  301. län -= 4;
  302. for (int i = 0; i < plän; i++)
  303. {
  304. if (index + i >= max)
  305. break;
  306. buff[index + i] = *(int*)bytes;
  307. bytes += 4;
  308. län -= 4;
  309. }
  310. }
  311. break;
  312. case 6: // Runde Spieler Statistik
  313. if (1)
  314. {
  315. int runde = *(int*)bytes;
  316. bytes += 4;
  317. län -= 4;
  318. int anz = rs->getEintragAnzahl();
  319. for (int i = 0; i < anz; i++)
  320. {
  321. if (rs->hat(i) && rs->get(i)->rundenNummer == runde)
  322. {
  323. SSDRundeSpieler* ssdrs = new SSDRundeSpieler();
  324. ssdrs->spielerNummer = *(int*)bytes;
  325. bytes += 4;
  326. län -= 4;
  327. char snlän = *bytes;
  328. län--;
  329. bytes++;
  330. char* txt = new char[snlän + 1];
  331. txt[snlän] = 0;
  332. for (int j = 0; j < snlän; j++)
  333. txt[j] = bytes[j];
  334. bytes += snlän;
  335. län -= snlän;
  336. ssdrs->spielerName = txt;
  337. delete[] txt;
  338. char tnlän = *bytes;
  339. län--;
  340. bytes++;
  341. txt = new char[tnlän + 1];
  342. txt[tnlän] = 0;
  343. for (int j = 0; j < tnlän; j++)
  344. txt[j] = bytes[j];
  345. bytes += tnlän;
  346. län -= tnlän;
  347. ssdrs->teamName = txt;
  348. delete[] txt;
  349. ssdrs->spielerFarbe = *(int*)bytes;
  350. bytes += 4;
  351. län -= 4;
  352. ssdrs->teamFarbe = *(int*)bytes;
  353. bytes += 4;
  354. län -= 4;
  355. ssdrs->linienLänge = *(int*)bytes;
  356. bytes += 4;
  357. län -= 4;
  358. ssdrs->kills = *(int*)bytes;
  359. bytes += 4;
  360. län -= 4;
  361. ssdrs->todesZeit = *(int*)bytes;
  362. bytes += 4;
  363. län -= 4;
  364. rs->get(i)->spieler.add(ssdrs);
  365. break;
  366. }
  367. }
  368. }
  369. break;
  370. case 7: // Runde Team Statistik
  371. if (1)
  372. {
  373. int runde = *(int*)bytes;
  374. bytes += 4;
  375. län -= 4;
  376. int anz = rs->getEintragAnzahl();
  377. for (int i = 0; i < anz; i++)
  378. {
  379. if (rs->hat(i) && rs->get(i)->rundenNummer == runde)
  380. {
  381. SSDRundeTeam* ssdrt = new SSDRundeTeam();
  382. ssdrt->teamNummer = *(int*)bytes;
  383. bytes += 4;
  384. län -= 4;
  385. char tnlän = *bytes;
  386. län--;
  387. bytes++;
  388. char* txt = new char[tnlän + 1];
  389. txt[tnlän] = 0;
  390. for (int j = 0; j < tnlän; j++)
  391. txt[j] = bytes[j];
  392. bytes += tnlän;
  393. län -= tnlän;
  394. ssdrt->teamName = txt;
  395. delete[] txt;
  396. ssdrt->teamFarbe = *(int*)bytes;
  397. bytes += 4;
  398. län -= 4;
  399. ssdrt->ergebnis = *bytes;
  400. bytes++;
  401. län--;
  402. ssdrt->linienLänge = *(int*)bytes;
  403. bytes += 4;
  404. län -= 4;
  405. ssdrt->kills = *(int*)bytes;
  406. bytes += 4;
  407. län -= 4;
  408. ssdrt->tode = *(int*)bytes;
  409. bytes += 4;
  410. län -= 4;
  411. rs->get(i)->teams.add(ssdrt);
  412. break;
  413. }
  414. }
  415. }
  416. break;
  417. case 8: // Chat Nachricht
  418. if (1)
  419. {
  420. int vonAccount = *(int*)bytes;
  421. bytes += 4;
  422. län -= 4;
  423. char* txt = new char[län + 1];
  424. txt[län] = 0;
  425. for (int i = 0; i < län; i++)
  426. txt[i] = bytes[i];
  427. if (status == 1)
  428. chat->addChatNachricht(vonAccount, txt);
  429. delete[] txt;
  430. }
  431. break;
  432. case 9: // Spieler hat verlassen
  433. if (1)
  434. {
  435. int acc = *(int*)bytes;
  436. bytes += 4;
  437. län -= 4;
  438. if (status == 1)
  439. chat->spielerOffline(acc);
  440. }
  441. break;
  442. default:
  443. // Fehler
  444. break;
  445. }
  446. if (län != 0)
  447. {
  448. // Fehler
  449. }
  450. unlock();
  451. }
  452. void SpielStatistik::doPublicMausEreignis(MausEreignis& me)
  453. {
  454. if (!status)
  455. return;
  456. lock();
  457. if (status == 1)
  458. {
  459. tabelle->doPublicMausEreignis(me);
  460. runde->doPublicMausEreignis(me);
  461. chat->doPublicMausEreignis(me);
  462. }
  463. unlock();
  464. }
  465. void SpielStatistik::doTastaturEreignis(TastaturEreignis& te)
  466. {
  467. if (!status)
  468. return;
  469. lock();
  470. if (status == 1)
  471. chat->doTastaturEreignis(te);
  472. unlock();
  473. }
  474. bool SpielStatistik::tick(double zeit)
  475. {
  476. if (!status)
  477. return 0;
  478. lock();
  479. if (status == 1)
  480. {
  481. rend |= chat->tick(zeit);
  482. rend |= runde->tick(zeit);
  483. rend |= tabelle->tick(zeit);
  484. if ((chat->hatVerlassen() || runde->mussVerlassen()) && status == 1)
  485. {
  486. spielc->trenne();
  487. status = 2;
  488. }
  489. runde->setRunde(tabelle->getRunde());
  490. }
  491. bool ret = rend;
  492. rend = 0;
  493. unlock();
  494. return ret;
  495. }
  496. void SpielStatistik::render(Bild& zRObj)
  497. {
  498. if (!status)
  499. return;
  500. lock();
  501. chat->render(zRObj);
  502. runde->render(zRObj);
  503. tabelle->render(zRObj);
  504. unlock();
  505. }
  506. void SpielStatistik::verlassen()
  507. {
  508. if (spielc)
  509. spielc->trenne();
  510. status = 2;
  511. }
  512. // constant
  513. int SpielStatistik::getStatus() const // 0 = laden, 1 = läuft, 2 = fortsetzen
  514. {
  515. return status;
  516. }