123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- #include "StatistikLeser.h"
- // Inhalt der StatistikLeser Klasse aus StatistikLeser.h
- // Konstruktor
- StatistikLeser::StatistikLeser( int spielId )
- {
- nachrichten = new SpielNachricht( spielId );
- bestenliste = new VideoBestenliste( 0 );
- map = new VideoKarte();
- spieler = new RCArray< VideoSpieler >();
- ssdgs = new Array< SSDGesamtSpieler* >();
- ssdgt = new Array< SSDGesamtTeam* >();
- ssdr = new Array< SSDRunde* >();
- spielerAnzahl = 0;
- teamAnzahl = 0;
- rundenAnzahl = 0;
- ref = 1;
- Text f;
- fehler = nachrichten->hatFehler( &f );
- if( fehler )
- return;
- // Spiel Initialisieren
- spielerAnzahl = nachrichten->getSVD()->spielerAnzahl;
- teamAnzahl = nachrichten->getTeamAnzahl();
- int maxTeam = 0;
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- SpielerVideoDaten *dat = nachrichten->getSPVD( i );
- VideoSpieler *tmp = new VideoSpieler( dat );
- bestenliste->addSpieler( tmp );
- spieler->set( tmp, i );
- maxTeam = maxTeam < dat->team ? dat->team : maxTeam;
- }
- maxTeam++;
- bestenliste->setTeamAnzahl( maxTeam );
- for( int i = 0; i < nachrichten->getTeamAnzahl(); i++ )
- {
- TeamVideoDaten *dat = nachrichten->getTVD( i );
- bestenliste->setTeamMaxPunkte( dat->teamNummer, dat->maxPunkte );
- bestenliste->setTeamPunkte( dat->teamNummer, dat->punkte );
- }
- RundeVideoDaten *rDat = nachrichten->getRVD();
- map->setSize( rDat->mapBreite, rDat->mapHöhe );
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- RundeSpielerVideoDaten *dat = nachrichten->getRSVD( i );
- spieler->z( i )->neuRunde( 1, dat, 1 );
- }
- Array< int > rundenSieger;
- Array< int > rundenDauer;
- VideoMSG *nMsg = 0;
- double sZeit = 0;
- // Spiel nachstellen
- while( 1 )
- {
- while( !nMsg || nMsg->typ )
- {
- if( !nMsg )
- nMsg = nachrichten->GetNextNachricht();
- if( !nMsg )
- break;
- if( !nMsg->typ )
- break;
- VideoAktionMSG *ak = (VideoAktionMSG*)nMsg;
- switch( ak->aktion )
- {
- case 0: // T_Links Press
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
- {
- spieler->z( i )->setLinksKurve( 1 );
- break;
- }
- }
- break;
- case 1: // T_Links Release
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
- {
- spieler->z( i )->setLinksKurve( 0 );
- break;
- }
- }
- break;
- case 2: // T_Rechts Press
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
- {
- spieler->z( i )->setRechtsKurve( 1 );
- break;
- }
- }
- break;
- case 3: // T_Rechts Release
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
- {
- spieler->z( i )->setRechtsKurve( 0 );
- break;
- }
- }
- break;
- case 5: // Linien Unterbrechung
- if( 1 )
- {
- VideoLinieMSG *lMsg = (VideoLinieMSG*)ak;
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- if( spieler->z( i )->getSpielerNummer() == ak->spielerNummer )
- {
- spieler->z( i )->setLinienUnterbrechung( lMsg->unterbrechung != 0 );
- break;
- }
- }
- }
- break;
- }
- nMsg = 0;
- }
- if( !nMsg )
- break;
- sZeit += TICK;
- bool rEnd = 0;
- int tmpTeam = -1;
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- VideoSpieler *tmp = spieler->z( i );
- if( tmp )
- {
- bool amLeben = tmp->istAmLeben();
- tmp->tick( map->zMap(), TICK );
- if( amLeben != tmp->istAmLeben() )
- {
- for( int j = 0; j < spielerAnzahl; j++ )
- {
- VideoSpieler *s = spieler->z( j );
- if( s && s->getFarbe() == tmp->getKillFarbe() )
- s->addKill();
- if( s && s != tmp && s->istAmLeben() )
- bestenliste->addPunkt( s->getTeam(), s->getSpielerNummer(), 1 );
- }
- }
- if( amLeben && !tmp->istAmLeben() )
- { // gestorben
- int team = tmp->getTeam();
- bool teamLebt = 0;
- for( int k = 0; k < spielerAnzahl; k++ )
- {
- if( spieler->z( k ) && spieler->z( k )->getTeam() == team )
- teamLebt |= spieler->z( k )->istAmLeben();
- }
- if( !teamLebt )
- {
- int teamAmLebenAnzahl = 0;
- for( int k = 0; k < maxTeam; k++ )
- {
- if( !bestenliste->teamExistiert( k ) )
- continue;
- bool amLeben = 0;
- for( int l = 0; l < spielerAnzahl; l++ )
- {
- if( spieler->z( l ) && spieler->z( l )->getTeam() == k )
- amLeben |= spieler->z( l )->istAmLeben();
- }
- if( amLeben )
- {
- tmpTeam = k;
- teamAmLebenAnzahl++;
- bestenliste->addPunkt( k, 1 );
- }
- else
- bestenliste->addPunkt( k, 0 );
- if( !bestenliste->getTeamPunkte( k ) )
- bestenliste->setTeamStatus( k, "tod", 0xFFFF0000 );
- }
- if( teamAmLebenAnzahl <= 1 )
- rEnd = 1;
- }
- }
- }
- }
- if( rEnd )
- { // Runden Ende
- rundenSieger.set( tmpTeam, rundenAnzahl );
- rundenDauer.set( (int)sZeit, rundenAnzahl );
- rundenAnzahl++;
- sZeit = 0;
- int nAnz = 0;
- int nAnz2 = 0;
- for( int i = 0; i < maxTeam; i++ )
- {
- if( bestenliste->teamExistiert( i ) )
- {
- nAnz += bestenliste->hatTeamGewonnen( i );
- nAnz2 += bestenliste->getTeamPunkte( i ) >= 0;
- }
- }
- if( nAnz || nAnz2 <= 1 || rundenAnzahl >= 10 )
- {
- RundeSpielerVideoDaten dat;
- for( int i = 0; i < spielerAnzahl; i++ )
- spieler->z( i )->neuRunde( 1, &dat, 1 );
- break; // Spiel Ende
- }
- int r = nachrichten->setRundenEnde( 1 );
- bestenliste->updatePunkte();
- map->nextRunde( 1 );
- RundeVideoDaten *dat = nachrichten->getRVD();
- map->setSize( dat->mapBreite, dat->mapHöhe );
- for( int i = 0; i < spielerAnzahl; i++ )
- spieler->z( i )->neuRunde( 1, nachrichten->getRSVD( i ), bestenliste->getTeamPunkte( spieler->z( i )->getTeam() ) != 0 );
- }
- nMsg = 0;
- }
- // Statistik erstellen
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- SSDGesamtSpieler *ssdgs = new SSDGesamtSpieler();
- VideoSpieler *tmp = spieler->z( i );
- ssdgs->spielerNummer = tmp->getSpielerNummer();
- ssdgs->spielerName.setText( tmp->zName()->getText() );
- ssdgs->teamName.setText( tmp->zTeamName()->getText() );
- ssdgs->spielerFarbe = tmp->getFarbe();
- ssdgs->teamFarbe = tmp->getTeamFarbe();
- ssdgs->gewonneneRunden = tmp->getGewonneneRunden();
- ssdgs->punkte = bestenliste->getSpielerPunkte( tmp->getTeam(), tmp->getSpielerNummer() );
- ssdgs->linienLänge = tmp->getLinienLänge();
- ssdgs->zeitAmLeben = tmp->getZeitAmLeben();
- ssdgs->zeitTod = tmp->getZeitTod();
- ssdgs->kills = tmp->getKills();
- ssdgs->tode = tmp->getTode();
- this->ssdgs->set( ssdgs, i );
- }
- Array< int > teams;
- for( int i = 0; i < teamAnzahl; i++ )
- {
- for( int j = 0; j < spielerAnzahl; j++ )
- {
- if( teams.getWertIndex( spieler->z( j )->getTeam() ) < 0 )
- {
- teams.set( spieler->z( j )->getTeam(), i );
- break;
- }
- }
- if( teams.hat( i ) )
- {
- SSDGesamtTeam *ssdgt = new SSDGesamtTeam();
- ssdgt->teamNummer = teams.get( i );
- for( int j = 0; j < spielerAnzahl; j++ )
- {
- VideoSpieler *tmp = spieler->z( j );
- if( tmp->getTeam() == ssdgt->teamNummer )
- {
- ssdgt->teamName.setText( tmp->zTeamName()->getText() );
- ssdgt->teamFarbe = tmp->getTeamFarbe();
- break;
- }
- }
- ssdgt->gewonneneRunden = 0;
- for( int j = 0; j < rundenAnzahl; j++ )
- {
- if( rundenSieger.get( j ) == ssdgt->teamNummer )
- ssdgt->gewonneneRunden++;
- }
- ssdgt->punkte = 0;
- ssdgt->linienLänge = 0;
- ssdgt->kills = 0;
- ssdgt->tode = 0;
- for( int j = 0; j < spielerAnzahl; j++ )
- {
- VideoSpieler *tmp = spieler->z( j );
- if( tmp->getTeam() == ssdgt->teamNummer )
- {
- ssdgt->punkte += bestenliste->getSpielerPunkte( tmp->getTeam(), tmp->getSpielerNummer() );
- ssdgt->linienLänge += tmp->getLinienLänge();
- ssdgt->kills += tmp->getKills();
- ssdgt->tode += tmp->getTode();
- }
- }
- this->ssdgt->set( ssdgt, i );
- }
- }
- for( int i = 0; i < rundenAnzahl; i++ )
- {
- SSDRunde *ssdr = new SSDRunde();
- ssdr->rundenNummer = i;
- ssdr->rundenDauer = rundenDauer.get( i );
- ssdr->rundenSieger = rundenSieger.get( i );
- ssdr->rundenBild.neuBild( map->zMap( i )->getBreite(), map->zMap( i )->getHeight(), 0 );
- ssdr->rundenBild.drawBild( 0, 0, map->zMap( i )->getBreite(), map->zMap( i )->getHeight(), *map->zMap( i ) );
- ssdr->spielfeldNutzung = 0;
- int *rbBuff = ssdr->rundenBild.getBuffer();
- for( int j = 0; j < ssdr->rundenBild.getBreite() * ssdr->rundenBild.getHeight(); j++ )
- {
- if( rbBuff[ j ] )
- ssdr->spielfeldNutzung++;
- }
- ssdr->spielfeldNutzung = (int)( ( ssdr->spielfeldNutzung / ( (double)( ssdr->rundenBild.getBreite() * ssdr->rundenBild.getHeight() ) / 25 ) ) * 100 );
- for( int j = 0; j < spielerAnzahl; j++ )
- {
- VideoSpieler *tmp = spieler->z( j );
- SSDRundeSpieler *ssdrs = new SSDRundeSpieler();
- ssdrs->spielerNummer = tmp->getSpielerNummer();
- ssdrs->spielerName.setText( tmp->zName()->getText() );
- ssdrs->teamName.setText( tmp->zTeamName()->getText() );
- ssdrs->spielerFarbe = tmp->getFarbe();
- ssdrs->teamFarbe = tmp->getTeamFarbe();
- ssdrs->linienLänge = tmp->getLinienLänge( i );
- ssdrs->kills = tmp->getKills( i );
- ssdrs->todesZeit = tmp->getTodesZeit( i );
- ssdr->spieler.set( ssdrs, j );
- }
- for( int j = 0; j < teamAnzahl; j++ )
- {
- SSDRundeTeam *ssdrt = new SSDRundeTeam();
- ssdrt->teamNummer = teams.get( j );
- for( int k = 0; k < spielerAnzahl; k++ )
- {
- if( spieler->z( k )->getTeam() == ssdrt->teamNummer )
- {
- ssdrt->teamName.setText( spieler->z( k )->zTeamName()->getText() );
- ssdrt->teamFarbe = spieler->z( k )->getTeamFarbe();
- break;
- }
- }
- ssdrt->ergebnis = rundenSieger.get( i ) == ssdrt->teamNummer;
- ssdrt->linienLänge = 0;
- ssdrt->kills = 0;
- ssdrt->tode = 0;
- for( int k = 0; k < spielerAnzahl; k++ )
- {
- VideoSpieler *tmp = spieler->z( j );
- if( tmp->getTeam() == ssdrt->teamNummer )
- {
- ssdrt->linienLänge += tmp->getLinienLänge( i );
- ssdrt->kills += tmp->getKills( i );
- ssdrt->tode += tmp->getTodesZeit( i ) != 0;
- }
- }
- ssdr->teams.set( ssdrt, j );
- }
- this->ssdr->set( ssdr, i );
- }
- }
- // Destruktor
- StatistikLeser::~StatistikLeser()
- {
- nachrichten->release();
- bestenliste->release();
- map->release();
- spieler->release();
- ssdgs->release();
- ssdgt->release();
- ssdr->release();
- }
- // constant
- bool StatistikLeser::hatFehler() const
- {
- return fehler;
- }
- int StatistikLeser::getSpielerAnzahl() const
- {
- return spielerAnzahl;
- }
- int StatistikLeser::getTeamAnzahl() const
- {
- return teamAnzahl;
- }
- int StatistikLeser::getRundenAnzahl() const
- {
- return rundenAnzahl;
- }
- SSDGesamtSpieler *StatistikLeser::getSSDGS( int index ) const
- {
- return ssdgs->get( index );
- }
- SSDGesamtTeam *StatistikLeser::getSSDGT( int index ) const
- {
- return ssdgt->get( index );
- }
- SSDRunde *StatistikLeser::getSSDR( int runde ) const
- {
- return ssdr->get( runde );
- }
- // Reference Counting
- StatistikLeser *StatistikLeser::getThis()
- {
- ref++;
- return this;
- }
- StatistikLeser *StatistikLeser::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
|