123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 |
- #include "SpielStatistik.h"
- #include <MausEreignis.h>
- #include <Punkt.h>
- // Inhalt der SpielStatistik Klasse aus SpielStatistik.h
- // Konstruktor
- SpielStatistik::SpielStatistik()
- : ReferenceCounter()
- {
- InitializeCriticalSection(&cs);
- addNachrichtF = 0;
- addChatF = 0;
- addFreundF = 0;
- accountAnsehenF = 0;
- istFreundF = 0;
- nachrichtParam = 0;
- bilder = 0;
- infoc = 0;
- spielc = 0;
- status = 0;
- gss = new Array< SSDGesamtSpieler* >();
- gts = new Array< SSDGesamtTeam* >();
- rs = new Array< SSDRunde* >();
- chat = 0;
- runde = 0;
- tabelle = 0;
- accountId = 0;
- rend = 0;
- }
- // Destruktor
- SpielStatistik::~SpielStatistik()
- {
- if (chat)
- chat->release();
- if (runde)
- runde->release();
- if (tabelle)
- tabelle->release();
- if (infoc)
- infoc->release();
- if (spielc)
- spielc->release();
- int anz = gss->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (gss->hat(i))
- delete gss->get(i);
- }
- gss->release();
- anz = gts->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (gts->hat(i))
- delete gts->get(i);
- }
- gts->release();
- anz = rs->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (rs->hat(i))
- {
- int anz2 = rs->get(i)->spieler.getEintragAnzahl();
- for (int j = 0; j < anz2; j++)
- {
- if (rs->get(i)->spieler.hat(j))
- delete rs->get(i)->spieler.get(j);
- }
- anz2 = rs->get(i)->teams.getEintragAnzahl();
- for (int j = 0; j < anz2; j++)
- {
- if (rs->get(i)->teams.hat(j))
- delete rs->get(i)->teams.get(j);
- }
- delete rs->get(i);
- }
- }
- rs->release();
- DeleteCriticalSection(&cs);
- }
- // nicht constant
- void SpielStatistik::lock()
- {
- EnterCriticalSection(&cs);
- }
- void SpielStatistik::unlock()
- {
- LeaveCriticalSection(&cs);
- }
- void SpielStatistik::bereit()
- {
- char byte = 1;
- spielc->statistikNachricht(1, &byte);
- }
- void SpielStatistik::setBilder(BilderV* b)
- {
- bilder = b;
- }
- void SpielStatistik::setAccountId(int id)
- {
- accountId = id;
- }
- void SpielStatistik::setRückrufFunktionen(void(*addNachrichtF)(void*, Text*, Text*, Text*, Text*),
- void(*addChatF)(void*, int), void(*addFreundF)(void*, int),
- void(*accountAnsehenF)(void*, int), bool(*istFreundF)(void*, int), void* nachrichtParam)
- {
- this->addNachrichtF = addNachrichtF;
- this->addChatF = addChatF;
- this->addFreundF = addFreundF;
- this->accountAnsehenF = accountAnsehenF;
- this->istFreundF = istFreundF;
- this->nachrichtParam = nachrichtParam;
- }
- void SpielStatistik::setUIFactory(UIInit& factory)
- {
- uiFactory = factory;
- }
- void SpielStatistik::setKlients(KSGClient::InformationServerClient* infoc, KSGClient::SpielServerClient* spielc)
- {
- if (this->infoc)
- this->infoc->release();
- if (this->spielc)
- this->spielc->release();
- this->infoc = infoc;
- this->spielc = spielc;
- }
- void SpielStatistik::nachricht(int län, const char* bytes)
- {
- lock();
- char num = *bytes;
- bytes++;
- län--;
- switch (num)
- {
- case 1: // Ladevorgang abgeschlossen
- if (1)
- {
- chat = new StatistikChat(accountId, dynamic_cast<KSGClient::SpielServerClient*>(spielc->getThis()), dynamic_cast<KSGClient::InformationServerClient*>(infoc->getThis()), uiFactory, bilder, addNachrichtF, addChatF, addFreundF, accountAnsehenF, nachrichtParam);
- int anz = gss->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (gss->hat(i))
- {
- int acc = infoc->getAccountId(gss->get(i)->spielerName);
- if (acc)
- chat->addSpieler(acc, istFreundF(nachrichtParam, acc) || acc == accountId);
- }
- }
- runde = new StatistikRunde(uiFactory, dynamic_cast<Array<SSDRunde*> *>(rs->getThis()));
- tabelle = new StatistikTabelle(dynamic_cast<Array<SSDGesamtSpieler*> *>(gss->getThis()), dynamic_cast<Array<SSDGesamtTeam*> *>(gts->getThis()), dynamic_cast<Array<SSDRunde*> *>(rs->getThis()), uiFactory);
- status = 1;
- }
- break;
- case 2: // Gesammt Spieler Statistik
- if (1)
- {
- SSDGesamtSpieler* ssdgs = new SSDGesamtSpieler();
- ssdgs->spielerNummer = *(int*)bytes;
- bytes += 4;
- län -= 4;
- char snlän = *bytes;
- län--;
- bytes++;
- char* txt = new char[snlän + 1];
- txt[snlän] = 0;
- for (int i = 0; i < snlän; i++)
- txt[i] = bytes[i];
- bytes += snlän;
- län -= snlän;
- ssdgs->spielerName = txt;
- delete[] txt;
- char tnlän = *bytes;
- län--;
- bytes++;
- txt = new char[tnlän + 1];
- txt[tnlän] = 0;
- for (int i = 0; i < tnlän; i++)
- txt[i] = bytes[i];
- bytes += tnlän;
- län -= tnlän;
- ssdgs->teamName = txt;
- delete[] txt;
- ssdgs->spielerFarbe = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->teamFarbe = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->gewonneneRunden = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->punkte = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->linienLänge = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->zeitAmLeben = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->zeitTod = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->kills = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->tode = *(int*)bytes;
- bytes += 4;
- län -= 4;
- gss->add(ssdgs);
- }
- break;
- case 3: // Gesammt Team Statistik
- if (1)
- {
- SSDGesamtTeam* ssdgt = new SSDGesamtTeam();
- ssdgt->teamNummer = *(int*)bytes;
- bytes += 4;
- län -= 4;
- char tnlän = *bytes;
- län--;
- bytes++;
- char* txt = new char[tnlän + 1];
- txt[tnlän] = 0;
- for (int i = 0; i < tnlän; i++)
- txt[i] = bytes[i];
- bytes += tnlän;
- län -= tnlän;
- ssdgt->teamName = txt;
- delete[] txt;
- ssdgt->teamFarbe = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->gewonneneRunden = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->punkte = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->linienLänge = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->kills = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->tode = *(int*)bytes;
- bytes += 4;
- län -= 4;
- gts->add(ssdgt);
- }
- break;
- case 4: // Runde Statistik
- if (1)
- {
- SSDRunde* ssdr = new SSDRunde();
- ssdr->rundenNummer = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdr->rundenDauer = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdr->rundenSieger = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdr->spielfeldNutzung = *(int*)bytes;
- bytes += 4;
- län -= 4;
- int breite = *(int*)bytes;
- bytes += 4;
- län -= 4;
- int höhe = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdr->rundenBild.neuBild(breite, höhe, 0);
- rs->add(ssdr);
- }
- break;
- case 5: // Runde Bild
- if (1)
- {
- int runde = *(int*)bytes;
- bytes += 4;
- län -= 4;
- int* buff = 0;
- int max = 0;
- int anz = rs->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (rs->hat(i) && rs->get(i)->rundenNummer == runde)
- {
- buff = rs->get(i)->rundenBild.getBuffer();
- max = rs->get(i)->rundenBild.getBreite() * rs->get(i)->rundenBild.getHeight();
- break;
- }
- }
- if (!buff)
- break;
- int index = *(int*)bytes;
- bytes += 4;
- län -= 4;
- int plän = *(int*)bytes;
- bytes += 4;
- län -= 4;
- for (int i = 0; i < plän; i++)
- {
- if (index + i >= max)
- break;
- buff[index + i] = *(int*)bytes;
- bytes += 4;
- län -= 4;
- }
- }
- break;
- case 6: // Runde Spieler Statistik
- if (1)
- {
- int runde = *(int*)bytes;
- bytes += 4;
- län -= 4;
- int anz = rs->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (rs->hat(i) && rs->get(i)->rundenNummer == runde)
- {
- SSDRundeSpieler* ssdrs = new SSDRundeSpieler();
- ssdrs->spielerNummer = *(int*)bytes;
- bytes += 4;
- län -= 4;
- char snlän = *bytes;
- län--;
- bytes++;
- char* txt = new char[snlän + 1];
- txt[snlän] = 0;
- for (int j = 0; j < snlän; j++)
- txt[j] = bytes[j];
- bytes += snlän;
- län -= snlän;
- ssdrs->spielerName = txt;
- delete[] txt;
- char tnlän = *bytes;
- län--;
- bytes++;
- txt = new char[tnlän + 1];
- txt[tnlän] = 0;
- for (int j = 0; j < tnlän; j++)
- txt[j] = bytes[j];
- bytes += tnlän;
- län -= tnlän;
- ssdrs->teamName = txt;
- delete[] txt;
- ssdrs->spielerFarbe = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdrs->teamFarbe = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdrs->linienLänge = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdrs->kills = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdrs->todesZeit = *(int*)bytes;
- bytes += 4;
- län -= 4;
- rs->get(i)->spieler.add(ssdrs);
- break;
- }
- }
- }
- break;
- case 7: // Runde Team Statistik
- if (1)
- {
- int runde = *(int*)bytes;
- bytes += 4;
- län -= 4;
- int anz = rs->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (rs->hat(i) && rs->get(i)->rundenNummer == runde)
- {
- SSDRundeTeam* ssdrt = new SSDRundeTeam();
- ssdrt->teamNummer = *(int*)bytes;
- bytes += 4;
- län -= 4;
- char tnlän = *bytes;
- län--;
- bytes++;
- char* txt = new char[tnlän + 1];
- txt[tnlän] = 0;
- for (int j = 0; j < tnlän; j++)
- txt[j] = bytes[j];
- bytes += tnlän;
- län -= tnlän;
- ssdrt->teamName = txt;
- delete[] txt;
- ssdrt->teamFarbe = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdrt->ergebnis = *bytes;
- bytes++;
- län--;
- ssdrt->linienLänge = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdrt->kills = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdrt->tode = *(int*)bytes;
- bytes += 4;
- län -= 4;
- rs->get(i)->teams.add(ssdrt);
- break;
- }
- }
- }
- break;
- case 8: // Chat Nachricht
- if (1)
- {
- int vonAccount = *(int*)bytes;
- bytes += 4;
- län -= 4;
- char* txt = new char[län + 1];
- txt[län] = 0;
- for (int i = 0; i < län; i++)
- txt[i] = bytes[i];
- if (status == 1)
- chat->addChatNachricht(vonAccount, txt);
- delete[] txt;
- }
- break;
- case 9: // Spieler hat verlassen
- if (1)
- {
- int acc = *(int*)bytes;
- bytes += 4;
- län -= 4;
- if (status == 1)
- chat->spielerOffline(acc);
- }
- break;
- default:
- // Fehler
- break;
- }
- if (län != 0)
- {
- // Fehler
- }
- unlock();
- }
- void SpielStatistik::doPublicMausEreignis(MausEreignis& me)
- {
- if (!status)
- return;
- lock();
- if (status == 1)
- {
- tabelle->doPublicMausEreignis(me);
- runde->doPublicMausEreignis(me);
- chat->doPublicMausEreignis(me);
- }
- unlock();
- }
- void SpielStatistik::doTastaturEreignis(TastaturEreignis& te)
- {
- if (!status)
- return;
- lock();
- if (status == 1)
- chat->doTastaturEreignis(te);
- unlock();
- }
- bool SpielStatistik::tick(double zeit)
- {
- if (!status)
- return 0;
- lock();
- if (status == 1)
- {
- rend |= chat->tick(zeit);
- rend |= runde->tick(zeit);
- rend |= tabelle->tick(zeit);
- if ((chat->hatVerlassen() || runde->mussVerlassen()) && status == 1)
- {
- spielc->trenne();
- status = 2;
- }
- runde->setRunde(tabelle->getRunde());
- }
- bool ret = rend;
- rend = 0;
- unlock();
- return ret;
- }
- void SpielStatistik::render(Bild& zRObj)
- {
- if (!status)
- return;
- lock();
- chat->render(zRObj);
- runde->render(zRObj);
- tabelle->render(zRObj);
- unlock();
- }
- void SpielStatistik::verlassen()
- {
- if (spielc)
- spielc->trenne();
- status = 2;
- }
- // constant
- int SpielStatistik::getStatus() const // 0 = laden, 1 = läuft, 2 = fortsetzen
- {
- return status;
- }
|