#include "AccountAktivität.h" #include "../../../Global/Initialisierung.h" #include "../../../Global/Variablen.h" // Inhalt der AccountAktivität Klasse aus AccountAktivität.h // Konstruktor AccountAktivität::AccountAktivität( Schrift *zSchrift ) : Thread(), aktivitätF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen, "Aktivität von " ) ), online( initLinienDiagramm( 10, 10, 760, 200, zSchrift, LDiag::Style::DatenRahmen, 0 ) ), spiele( initLinienDiagramm( 10, 220, 760, 200, zSchrift, LDiag::Style::DatenRahmen, 0 ) ), status( 0 ), accId( 0 ), animation( 0 ), alpha( 255 ), tickVal( 0 ), rend( 0 ), ref( 1 ) { online->setHIntervallBreite( 36.8 ); spiele->setVIntervallHeight( 36.8 ); online->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall ); spiele->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall ); online->setRasterDicke( 1 ); spiele->setRasterDicke( 1 ); online->setRasterFarbe( 0xFF505050 ); spiele->setRasterFarbe( 0xFF505050 ); online->setHIntervallFarbe( 0xFFFFFFFF ); spiele->setHIntervallFarbe( 0xFFFFFFFF ); online->setHIntervallName( "Tage" ); spiele->setHIntervallName( "Tage" ); online->setVIntervallFarbe( 0xFFFFFFFF ); spiele->setVIntervallFarbe( 0xFFFFFFFF ); online->setVIntervallName( "Stunden" ); spiele->setVIntervallName( "Spiele" ); aktivitätF->addMember( online ); aktivitätF->addMember( spiele ); } // Destruktor AccountAktivität::~AccountAktivität() { if( run ) { warteAufThread( 1000 ); ende(); } aktivitätF->release(); online->release(); spiele->release(); } // nicht constant void AccountAktivität::reset() { int wAnz = online->zDiagDaten()->werte->getEintragAnzahl(); for( int i = 0; i < wAnz; i++ ) online->removeWert( 0 ); wAnz = spiele->zDiagDaten()->werte->getEintragAnzahl(); for( int i = 0; i < wAnz; i++ ) spiele->removeWert( 0 ); wAnz = online->zDiagDaten()->hIntervallWerte->getEintragAnzahl(); for( int i = 0; i < wAnz; i++ ) online->removeHIntervallText( online->zDiagDaten()->hIntervallWerte->get( 0 ) ); wAnz = spiele->zDiagDaten()->hIntervallWerte->getEintragAnzahl(); for( int i = 0; i < wAnz; i++ ) spiele->removeHIntervallText( spiele->zDiagDaten()->hIntervallWerte->get( 0 ) ); wAnz = online->zDiagDaten()->vIntervallWerte->getEintragAnzahl(); for( int i = 0; i < wAnz; i++ ) online->removeVIntervallText( online->zDiagDaten()->vIntervallWerte->get( 0 ) ); wAnz = spiele->zDiagDaten()->vIntervallWerte->getEintragAnzahl(); for( int i = 0; i < wAnz; i++ ) spiele->removeVIntervallText( spiele->zDiagDaten()->vIntervallWerte->get( 0 ) ); } void AccountAktivität::ladeStatistik( int accId ) { if( this->accId == accId ) return; this->status = 0; if( run ) { warteAufThread( 1000 ); ende(); } if( ( animation | 0x1 ) == animation ) { animation |= 0x4; this->accId = accId; this->status = 1; return; } if( this->accId ) reset(); this->accId = accId; start(); this->status = 1; } void AccountAktivität::thread() { Text *name = infoKlient->getSpielerName( accId ); if( name ) { name->insert( 0, "Aktivität von " ); aktivitätF->setTitel( *name ); name->release(); } RCArray< Text > *datum = new RCArray< Text >(); Array< double > *stOnline = new Array< double >(); Array< double > *stGespielt = new Array< double >(); Array< int > *anzSpiele = new Array< int >(); Array< int > *anzGewonnen = new Array< int >(); if( infoKlient->getSpielerAktivität( accId, datum, stOnline, stGespielt, anzSpiele, anzGewonnen ) ) { int anz = datum->getEintragAnzahl(); double maxO = 0; int maxS = 0; for( int i = 0; i < anz; i++ ) { if( stOnline->hat( i ) && stOnline->get( i ) > maxO ) maxO = stOnline->get( i ); if( stGespielt->hat( i ) && stGespielt->get( i ) > maxO ) maxO = stGespielt->get( i ); if( anzSpiele->hat( i ) && anzSpiele->get( i ) > maxS ) maxS = anzSpiele->get( i ); if( anzGewonnen->hat( i ) && anzGewonnen->get( i ) > maxS ) maxS = anzGewonnen->get( i ); } maxO += ( maxO / 100 ) * 10; maxS++; online->addVIntervallText( 0, "0" ); online->addVIntervallText( (int)maxO + 1, Text() += (int)( maxO + 1 ) ); spiele->addVIntervallText( 0, "0" ); spiele->addVIntervallText( (int)maxS + 1, Text() += (int)( maxS + 1 ) ); online->addHIntervallText( 0, datum->z( 0 )->getText() ); online->addHIntervallText( anz - 1, datum->z( anz - 1 )->getText() ); spiele->addHIntervallText( 0, datum->z( 0 )->getText() ); spiele->addHIntervallText( anz - 1, datum->z( anz - 1 )->getText() ); DiagWert *w = new DiagWert(); w->farbe = 0xFF00FFFF; w->hintergrund = 0xFF205050; w->name->setText( "Zeit Online" ); w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund; online->addWert( w ); w = new DiagWert(); w->farbe = 0xFF00FF00; w->hintergrund = 0xFF205020; w->name->setText( "Zeit im Spiel" ); w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund; online->addWert( w ); w = new DiagWert(); w->farbe = 0xFF00FFFF; w->hintergrund = 0xFF205050; w->name->setText( "Spiele am Tag" ); w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund; spiele->addWert( w ); w = new DiagWert(); w->farbe = 0xFF00FF00; w->hintergrund = 0xFF205020; w->name->setText( "Gewonnene Spiele" ); w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund; spiele->addWert( w ); for( int i = 0; i < anz; i++ ) { online->addPunkt( 0, i, stOnline->get( i ) ); online->addPunkt( 1, i, stGespielt->get( i ) ); spiele->addPunkt( 0, i, anzSpiele->get( i ) ); spiele->addPunkt( 1, i, anzGewonnen->get( i ) ); } } else nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Aktivität des Spielers konnte nicht ermittelt werden." ), new Text( "Ok" ) ); datum->release(); stOnline->release(); stGespielt->release(); anzSpiele->release(); anzGewonnen->release(); animation &= ~0x4; status = 2; run = 0; } void AccountAktivität::setSichtbar( bool sichtbar, bool nachRechts ) { if( sichtbar ) { if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) ) { if( nachRechts ) aktivitätF->setPosition( -810, 40 ); else aktivitätF->setPosition( 810, 40 ); } animation |= 0x1; } else animation &= ~0x1; if( nachRechts ) animation |= 0x2; else animation &= ~0x2; } bool AccountAktivität::tick( double zeit ) { rend |= aktivitätF->tick( zeit ); tickVal += zeit; int valA = (int)( tickVal * 150 ); int valB = (int)( tickVal * 500 ); tickVal -= valA / 150.0; if( valA ) { if( ( animation | 0x4 ) == animation && alpha ) { if( alpha - valA <= 0 ) alpha = 0; else alpha -= valA; rend = 1; if( !alpha ) { reset(); start(); } } if( ( animation | 0x4 ) != animation && alpha != 255 ) { if( alpha + valA >= 255 ) alpha = 255; else alpha += valA; rend = 1; } } if( valB ) { if( ( animation | 0x1 ) == animation ) { // Sichtbar if( ( animation | 0x2 ) == animation ) { // Nach Rechts if( aktivitätF->getX() != 10 ) { if( aktivitätF->getX() + valB > 10 ) aktivitätF->setPosition( 10, aktivitätF->getY() ); else aktivitätF->setPosition( aktivitätF->getX() + valB, aktivitätF->getY() ); rend = 1; } } else { // Nach Links if( aktivitätF->getX() != 10 ) { if( aktivitätF->getX() - valB < 10 ) aktivitätF->setPosition( 10, aktivitätF->getY() ); else aktivitätF->setPosition( aktivitätF->getX() - valB, aktivitätF->getY() ); rend = 1; } } } else { // Unsichtbar if( ( animation | 0x2 ) == animation ) { // Nach Rechts if( aktivitätF->getX() != 810 ) { if( aktivitätF->getX() + valB > 810 ) aktivitätF->setPosition( 810, aktivitätF->getY() ); else aktivitätF->setPosition( aktivitätF->getX() + valB, aktivitätF->getY() ); rend = 1; } } else { // Nach Links if( aktivitätF->getX() != -810 ) { if( aktivitätF->getX() - valB < -810 ) aktivitätF->setPosition( -810, aktivitätF->getY() ); else aktivitätF->setPosition( aktivitätF->getX() - valB, aktivitätF->getY() ); rend = 1; } } } } bool ret = rend; rend = 0; return ret; } void AccountAktivität::render( Bild &zRObj ) { zRObj.setAlpha( alpha ); aktivitätF->render( zRObj ); zRObj.releaseAlpha(); } // constant int AccountAktivität::getStatus() const { return status; } // Reference Counting AccountAktivität *AccountAktivität::getThis() { ref++; return this; } AccountAktivität *AccountAktivität::release() { ref--; if( !ref ) delete this; return 0; }