123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- #include "SpielStatistik.h"
- SpielStatistik::SpielStatistik()
- {
- InitializeCriticalSection( &cs );
- addNachrichtF = 0;
- addChatF = 0;
- addFreundF = 0;
- accountAnsehenF = 0;
- istFreundF = 0;
- nachrichtParam = 0;
- bilder = 0;
- schrift = 0;
- screen = 0;
- infoc = 0;
- spielc = 0;
- status = 0;
- gss = new Array< SSDSpieler * >();
- gts = new Array< SSDTeam * >();
- chat = 0;
- tabelle = 0;
- accountId = 0;
- rend = 0;
- ref = 1;
- }
- SpielStatistik::~SpielStatistik()
- {
- if( chat )
- chat->release();
- if( tabelle )
- tabelle->release();
- if( schrift )
- schrift->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 );
- }
- 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::setSchrift( Schrift *schrift )
- {
- if( this->schrift )
- this->schrift->release();
- this->schrift = schrift;
- }
- void SpielStatistik::setBildschirm( Bildschirm *zScreen )
- {
- screen = zScreen;
- }
- 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, 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->lebenGeheilt = *(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->itemsAufgehoben = *(int *)bytes;
- bytes += 4;
- län -= 4;
- ssdgs->itemsVerwendet = *(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->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;
- gts->add( ssdgt );
- }
- break;
- case 2: // Ladevorgang abgeschlossen
- if( 1 )
- {
- chat = new StatistikChat( accountId, spielc->getThis(), infoc->getThis(), schrift->getThis(), 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( gss->getThis(), gts->getThis(), schrift, screen );
- status = 1;
- }
- break;
- case 3: // Chat Nachricht
- if( 1 )
- {
- int vonAccount = *(int *)bytes;
- bytes += 4;
- län -= 4;
- char *txt = new char[ (__int64)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;
- }
- // Reference Counting
- SpielStatistikV *SpielStatistik::getThis()
- {
- ref++;
- return this;
- }
- SpielStatistikV *SpielStatistik::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
|