123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- #include "SpielStatistik.h"
- #include "../Initialisierung/Initialisierung.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< SSDSpieler* >();
- gts = new Array< SSDTeam* >();
- chat = 0;
- tabelle = 0;
- accountId = 0;
- rend = 0;
- }
- // Destruktor
- SpielStatistik::~SpielStatistik()
- {
- if (chat)
- chat->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();
- DeleteCriticalSection(&cs);
- }
- // nicht constant
- void SpielStatistik::lock()
- {
- EnterCriticalSection(&cs);
- }
- void SpielStatistik::unlock()
- {
- LeaveCriticalSection(&cs);
- }
- void SpielStatistik::bereit()
- {
- char byte = 0;
- 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& uiFactory)
- {
- this->uiFactory = uiFactory;
- }
- 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 0: // Spieler Statistik
- if (1)
- {
- SSDSpieler* ssdgs = new SSDSpieler();
- 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->schadenBekommen = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->schadenGemacht = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->treibstoffVerbraucht = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->schüsse = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->treffer = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->punkte = *(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;
- ssdgs->zeitAmLeben = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->zeitTod = *(int*)bytes;
- bytes += 4;
- län -= 4;
- gss->add(ssdgs);
- }
- break;
- case 1: // Team Statistik
- if (1)
- {
- SSDTeam* ssdgt = new SSDTeam();
- 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->schadenBekommen = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->schadenGemacht = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->treibstoffVerbraucht = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->schüsse = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->treffer = *(int*)bytes;
- bytes += 4;
- län -= 4;
- ssdgt->punkte = *(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;
- ssdgt->gewonnen = *bytes != 0;
- bytes++;
- län--;
- gts->add(ssdgt);
- }
- break;
- case 2: // 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);
- }
- }
- tabelle = new StatistikTabelle(dynamic_cast<Array<SSDSpieler*> *>(gss->getThis()), dynamic_cast<Array<SSDTeam*> *>(gts->getThis()), uiFactory);
- status = 1;
- }
- break;
- case 3: // 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 4: // 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);
- 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 |= tabelle->tick(zeit);
- if (chat->hatVerlassen() && status == 1)
- {
- spielc->trenne();
- status = 2;
- }
- }
- bool ret = rend;
- rend = 0;
- unlock();
- return ret;
- }
- void SpielStatistik::render(Bild& zRObj)
- {
- if (!status)
- return;
- lock();
- chat->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;
- }
|