123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- #include "VideoNachricht.h"
- // Inhalt der RundeNachricht Klasse aus VideoNachricht.h
- // Konstruktor
- RundeNachricht::RundeNachricht( Datei *d, int spielerAnzahl )
- {
- index = 0;
- maxNachricht = 0;
- nachrichten = new Array< VideoMSG* >();
- vDat = d;
- rvd = new RundeVideoDaten();
- rsvd = new Array< RundeSpielerVideoDaten* >();
- aktiv = 1;
- ref = 1;
- vDat->lese( (char*)&rvd->mapBreite, 4 );
- vDat->lese( (char*)&rvd->mapHöhe, 4 );
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- RundeSpielerVideoDaten *svd = new RundeSpielerVideoDaten();
- vDat->lese( (char*)&svd->wendigkeit, 8 );
- vDat->lese( (char*)&svd->xPos, 8 );
- vDat->lese( (char*)&svd->yPos, 8 );
- vDat->lese( (char*)&svd->xSpeed, 8 );
- vDat->lese( (char*)&svd->ySpeed, 8 );
- rsvd->set( svd, i );
- }
- }
- // Destruktor
- RundeNachricht::~RundeNachricht()
- {
- for( int i = 0; i < maxNachricht; i++ )
- {
- VideoMSG *tmp = nachrichten->get( i );
- if( !tmp->typ )
- delete (VideoMSG*)tmp;
- else
- {
- if( ( (VideoAktionMSG*)tmp )->aktion == 4 )
- delete (VideoChatMSG*)tmp;
- else if( ( (VideoAktionMSG*)tmp )->aktion == 5 )
- delete (VideoLinieMSG*)tmp;
- else
- delete (VideoAktionMSG*)tmp;
- }
- }
- nachrichten->release();
- vDat->release();
- delete rvd;
- int anz = rsvd->getEintragAnzahl();
- for( int i = 0; i < anz; i++ )
- delete rsvd->get( i );
- rsvd->release();
- }
- // nicht constant
- VideoMSG *RundeNachricht::GetNextNachricht()
- {
- if( index < maxNachricht )
- {
- index++;
- return nachrichten->get( index - 1 );
- }
- else if( aktiv )
- {
- char typ = 0;
- vDat->lese( &typ, 1 );
- if( !typ )
- {
- VideoMSG *vtmsg = new VideoMSG();
- vtmsg->typ = typ;
- nachrichten->set( vtmsg, index );
- index++;
- maxNachricht++;
- return vtmsg;
- }
- else if( typ == 1 )
- {
- NachrichtVideoDaten nvd;
- vDat->lese( (char*)&nvd.spielerNummer, 4 );
- vDat->lese( (char*)&nvd.län, 2 );
- char *bytes = new char[ nvd.län ];
- vDat->lese( bytes, nvd.län );
- if( bytes[ 0 ] >= 0 && bytes[ 0 ] <= 3 )
- {
- VideoAktionMSG *vamsg = new VideoAktionMSG();
- vamsg->typ = typ;
- vamsg->spielerNummer = nvd.spielerNummer;
- vamsg->aktion = bytes[ 0 ];
- nachrichten->set( vamsg, index );
- index++;
- maxNachricht++;
- delete[] bytes;
- return vamsg;
- }
- if( bytes[ 0 ] == 4 )
- {
- VideoChatMSG *vcmsg = new VideoChatMSG();
- vcmsg->typ = typ;
- vcmsg->spielerNummer = nvd.spielerNummer;
- vcmsg->aktion = bytes[ 0 ];
- vcmsg->län = nvd.län - 1;
- vcmsg->msg.setText( bytes + 1, vcmsg->län );
- nachrichten->set( vcmsg, index );
- index++;
- maxNachricht++;
- delete[] bytes;
- return vcmsg;
- }
- if( bytes[ 0 ] == 5 )
- {
- VideoLinieMSG *vlmsg = new VideoLinieMSG();
- vlmsg->typ = typ;
- vlmsg->spielerNummer = nvd.spielerNummer;
- vlmsg->aktion = bytes[ 0 ];
- vlmsg->unterbrechung = *( bytes + 1 );
- nachrichten->set( vlmsg, index );
- index++;
- maxNachricht++;
- delete[] bytes;
- return vlmsg;
- }
- delete[] bytes;
- }
- else
- {
- VideoMSG *msg = new VideoMSG();
- msg->typ = typ;
- nachrichten->set( msg, index );
- index++;
- maxNachricht++;
- return msg;
- }
- }
- return 0;
- }
- VideoMSG *RundeNachricht::GetLastNachricht()
- {
- if( index == 0 )
- return 0;
- index--;
- return nachrichten->get( index );
- }
- void RundeNachricht::setEnde()
- {
- aktiv = 0;
- }
- // constant
- RundeVideoDaten *RundeNachricht::getRVD() const
- {
- return rvd;
- }
- RundeSpielerVideoDaten *RundeNachricht::getRSVD( int index ) const
- {
- if( !rsvd->hat( index ) )
- return 0;
- return rsvd->get( index );
- }
- // Reference Counting
- RundeNachricht *RundeNachricht::getThis()
- {
- ref++;
- return this;
- }
- RundeNachricht *RundeNachricht::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
- // Inhalt der SpielNachricht Klasse aus VideoNachricht.h
- // Konatruktor
- SpielNachricht::SpielNachricht( int num )
- {
- runde = 0;
- maxRunde = 0;
- teamAnzahl = 0;
- runden = new RCArray< RundeNachricht >();
- vDat = new Datei();
- svd = new SpielVideoDaten();
- spvd = new Array< SpielerVideoDaten* >();
- tvd = new Array< TeamVideoDaten* >();
- error = 0;
- fehler = new Text();
- ref = 1;
- Text pfad( "data/tmp/historie/" );
- pfad += num;
- pfad += "/verlauf.ksggl";
- vDat->setDatei( pfad );
- if( !vDat->open( Datei::Style::lesen ) )
- {
- *fehler = "Die Videodatei '";
- *fehler += pfad;
- *fehler += "' konnte nicht geöffnet werden.\nEs existiert eventuell keine Aufzeichnung von diesem Spiel.";
- error = 1;
- }
- Array< int > team;
- if( !error )
- {
- vDat->lese( (char*)&svd->spielerAnzahl, 4 );
- for( int i = 0; i < svd->spielerAnzahl; i++ )
- {
- SpielerVideoDaten *svd = new SpielerVideoDaten();
- vDat->lese( (char*)&svd->index, 4 );
- vDat->lese( (char*)&svd->spielerNummer, 4 );
- vDat->lese( (char*)&svd->kamBreite, 4 );
- vDat->lese( (char*)&svd->kamHöhe, 4 );
- vDat->lese( (char*)&svd->team, 4 );
- vDat->lese( (char*)&svd->spielerFarbe, 4 );
- vDat->lese( (char*)&svd->teamFarbe, 4 );
- char län = 0;
- vDat->lese( &län, 1 );
- char *n = new char[ län + 1 ];
- n[ län ] = 0;
- if( län )
- vDat->lese( n, län );
- svd->name.setText( n );
- delete[] n;
- vDat->lese( &län, 1 );
- n = new char[ län + 1 ];
- n[ län ] = 0;
- if( län )
- vDat->lese( n, län );
- svd->teamName.setText( n );
- delete[] n;
- spvd->set( svd, svd->index );
- if( team.getWertIndex( svd->team ) < 0 )
- {
- team.set( svd->team, teamAnzahl );
- teamAnzahl++;
- }
- }
- for( int i = 0; i < teamAnzahl; i++ )
- {
- TeamVideoDaten *t = new TeamVideoDaten();
- vDat->lese( (char*)&t->teamNummer, 4 );
- vDat->lese( (char*)&t->maxPunkte, 4 );
- vDat->lese( (char*)&t->punkte, 4 );
- tvd->set( t, i );
- }
- RundeNachricht *r = new RundeNachricht( vDat->getThis(), svd->spielerAnzahl );
- runden->set( r, runde );
- }
- }
- // Destruktor
- SpielNachricht::~SpielNachricht()
- {
- runden->release();
- vDat->close();
- vDat->release();
- for( int i = 0; i < svd->spielerAnzahl; i++ )
- delete spvd->get( i );
- delete svd;
- spvd->release();
- for( int i = 0; i < teamAnzahl; i++ )
- delete tvd->get( i );
- tvd->release();
- fehler->release();
- }
- // nicht constant
- VideoMSG *SpielNachricht::GetNextNachricht()
- {
- return runden->z( runde )->GetNextNachricht();
- }
- VideoMSG *SpielNachricht::GetLastNachricht()
- {
- return runden->z( runde )->GetLastNachricht();
- }
- int SpielNachricht::setRundenEnde( bool vorwärts )
- {
- if( vorwärts )
- {
- if( runde < maxRunde )
- runde++;
- else
- {
- runden->z( runde )->setEnde();
- runde++;
- maxRunde++;
- RundeNachricht *tmp = new RundeNachricht( vDat->getThis(), svd->spielerAnzahl );
- runden->set( tmp, runde );
- }
- }
- else
- runde--;
- if( runde < 0 )
- {
- runde = 0;
- return -1;
- }
- return runde;
- }
- // constant
- SpielVideoDaten *SpielNachricht::getSVD() const
- {
- return svd;
- }
- SpielerVideoDaten *SpielNachricht::getSPVD( int index ) const
- {
- if( !spvd->hat( index ) )
- return 0;
- return spvd->get( index );
- }
- TeamVideoDaten *SpielNachricht::getTVD( int index ) const
- {
- if( !tvd->hat( index ) )
- return 0;
- return tvd->get( index );
- }
- RundeVideoDaten *SpielNachricht::getRVD() const
- {
- return runden->z( runde )->getRVD();
- }
- RundeSpielerVideoDaten *SpielNachricht::getRSVD( int index ) const
- {
- return runden->z( runde )->getRSVD( index );
- }
- bool SpielNachricht::hatFehler( Text *txt ) const
- {
- txt->setText( fehler->getText() );
- return error;
- }
- int SpielNachricht::getTeamAnzahl() const
- {
- return teamAnzahl;
- }
- int SpielNachricht::getRunde() const
- {
- return runde;
- }
- // Reference Counting
- SpielNachricht *SpielNachricht::getThis()
- {
- ref++;
- return this;
- }
- SpielNachricht *SpielNachricht::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
|