#include "SpieleKaufen.h" #include #include #include "../../../Global/Initialisierung.h" #include "../../../Global/Variablen.h" #include #include #include void SpielKaufenKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **retVal ) { if( !p ) return; ( (SpieleKaufenAuswahl*)p )->ksgsAktion( parameter, retVal ); } // Inhalt der SpieleKaufenAuswahl Klasse aus SpieleKaufen.h // Konstruktor SpieleKaufenAuswahl::SpieleKaufenAuswahl( Schrift *zSchrift ) { spielId = 0; alpha = 0; ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" ); if( ksgs ) { KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( ksgs, KSGS_START_FUNKTION ); if( getKSGScript ) { fenster = getKSGScript(); fenster->setBildschirmZ( hauptScreen->getThis() ); fenster->setSchriftZ( zSchrift->getThis() ); fenster->setSize( 555, 380 ); fenster->setRückrufParam( this ); fenster->setRückrufFunktion( SpielKaufenKSGSAktion ); } else { fenster = 0; nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei " "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } } else { fenster = 0; nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } ram = new LRahmen(); ram->setSize( 555, 380 ); ram->setFarbe( 0xFFFFFFFF ); laden = ( Framework::Animation2D* )ladeAnimation->dublizieren(); laden->setPosition( 252, 165 ); laden->setSichtbar( 0 ); pos = Punkt( 220, 55 ); aktion = 0; ref = 1; } // Destruktor SpieleKaufenAuswahl::~SpieleKaufenAuswahl() { if( run ) warteAufThread( 2000 ); if( run ) ende(); if( fenster ) { fenster->zurücksetzen(); fenster->release(); } ram->release(); laden->release(); if( ksgs ) dllDateien->releaseDLL( "KSGScript.dll" ); } // nicht constant void SpieleKaufenAuswahl::ladeSpielSeite( int id ) { if( run ) warteAufThread( 2000 ); if( run ) return; spielId = id; aktion = 1; start(); } void SpieleKaufenAuswahl::reset() { if( run ) warteAufThread( 2000 ); if( run ) return; aktion = 0; start(); } void SpieleKaufenAuswahl::thread() { laden->setSichtbar( 1 ); if( !aktion || spielId ) { while( alpha ) Sleep( 100 ); if( !aktion ) spielId = 0; if( fenster ) fenster->zurücksetzen(); } if( aktion ) { while( alpha ) Sleep( 100 ); shopKlient->ladeSpielSeite( spielId ); Text *pfad = new Text( "data/tmp/shop/kaufen/spiele/" ); pfad->append( spielId ); pfad->append( "/seite.ksgs" ); if( fenster ) { fenster->setScriptDatei( pfad ); fenster->neuLaden(); } } laden->setSichtbar( 0 ); run = 0; } void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal ) { KSGSVariable *befehl = parameter->z( 0 ); if( !befehl ) return; Text *b = befehl->getText(); if( !b ) return; if( b->istGleich( "GetBesitzStatus" ) ) { int besitz = shopKlient->getSpielBesitzStatus( spielId ); KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION ); if( getKSGSVariable ) { KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += besitz ).getText() }; *retVal = getKSGSVariable( fenster, &def ); } else { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei " "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } b->release(); return; } if( b->istGleich( "GetPreis" ) ) { KSGSVariable *version = parameter->z( 1 ); if( !version ) { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. " "Sie könnte eventuell nicht richtig funktionieren." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } else { bool testVersion = !version->getInt(); int preis = shopKlient->getSpielPreis( spielId, testVersion ); KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION ); if( getKSGSVariable ) { KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += preis ).getText() }; *retVal = getKSGSVariable( fenster, &def ); } else { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei " "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } } b->release(); return; } if( b->istGleich( "GetTestVersionVerbleibend" ) ) { int verbleibend = shopKlient->getSpielTestversion( spielId ); KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION ); if( getKSGSVariable ) { KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += verbleibend ).getText() }; *retVal = getKSGSVariable( fenster, &def ); } else { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei " "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } b->release(); return; } if( b->istGleich( "GetErwerbbarStatus" ) ) { int erwerbbar = shopKlient->istSpielErwerbbar( spielId ); KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION ); if( getKSGSVariable ) { KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += erwerbbar ).getText() }; *retVal = getKSGSVariable( fenster, &def ); } else { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei " "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } b->release(); return; } if( b->istGleich( "GetKupfer" ) ) { int kupfer = infoKlient->getKupfer(); KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION ); if( getKSGSVariable ) { KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += kupfer ).getText() }; *retVal = getKSGSVariable( fenster, &def ); } else { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei " "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } b->release(); return; } if( b->istGleich( "Kaufen" ) ) { KSGSVariable *version = parameter->z( 1 ); if( !version ) { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. " "Sie könnte eventuell nicht richtig funktionieren." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } else { bool testVersion = !version->getInt(); if( !shopKlient->spielErwerben( spielId, testVersion ) ) { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Das Spiel konnte nicht erworben werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } else { int dgId = infoKlient->getDateiGruppeIdVonSpiel( spielId ); if( dgId ) { KSGTDatei *dg = new KSGTDatei( "data/dg.ksgt" ); dg->laden(); bool gefunden = 0; for( int i = 0; i < dg->getZeilenAnzahl(); i++ ) { if( dg->zFeld( i, 0 ) && TextZuInt( dg->zFeld( i, 0 )->getText(), 10 ) == dgId ) { gefunden = 1; break; } } if( !gefunden ) { for( int i = 0; i < dg->getZeilenAnzahl(); i++ ) { if( dg->zFeld( i, 3 ) && !dg->zFeld( i, 3 )->istGleich( "SOFORT" ) && !dg->zFeld( i, 3 )->istGleich( "NICHT" ) ) { int platz = TextZuInt( dg->zFeld( i, 3 )->getText(), 10 ) + 1; Text *plT = new Text(); plT->append( platz ); dg->zFeld( i, 3 )->setText( plT ); } } Text *idT = new Text(); idT->append( dgId ); Text *pfad = infoKlient->getDateiGruppePfad( dgId ); if( pfad ) { RCArray< Text > *zeile = new RCArray< Text >(); zeile->add( idT ); zeile->add( pfad ); zeile->add( new Text( "0" ) ); zeile->add( new Text( "0" ) ); dg->addZeile( 4, zeile ); } else idT->release(); } dg->speichern(); dg->release(); } } if( run ) warteAufThread( 2000 ); if( run ) { b->release(); return; } aktion = 1; start(); } b->release(); return; } if( b->istGleich( "GetBild" ) ) { KSGSVariable *pfad = parameter->z( 1 ); KSGSVariable *name = parameter->z( 2 ); if( !pfad || !name ) { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. " "Sie könnte eventuell nicht richtig funktionieren." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } else { Text *pf = pfad->getText(); Text *n = name->getText(); if( !pf || !n ) { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. " "Sie könnte eventuell nicht richtig funktionieren." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } else { KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION ); if( getKSGSVariable ) { int p = n->positionVon( ".ltdb/" ); if( p < 0 ) p = 0; else p += 6; Bild *b = bilder->get( *n ); if( !b ) { LTDBDatei *dat = new LTDBDatei(); dat->setDatei( pf->getThis() ); dat->leseDaten( 0 ); b = dat->laden( 0, n->getTeilText( p, n->getLength() ) ); dat->release(); if( b ) bilder->add( *n, b->getThis() ); } if( b ) { KSGSVariableDef def = { KSGS_BILD, 0, 3, "" }; KSGSVariable *ret = getKSGSVariable( fenster, &def ); KSGSSetBild setKSGSBild = (KSGSSetBild)GetProcAddress( ksgs, KSGS_SET_BILD_FUNKTION ); if( !setKSGSBild ) { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGS_SET_BILD_FUNKTION "' in der DLL-Datei " "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); b->release(); } else setKSGSBild( ret, b ); *retVal = ret; } } else { nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei " "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 ); } } if( pf ) pf->release(); if( n ) n->release(); } b->release(); return; } } void SpieleKaufenAuswahl::doMausEreignis( MausEreignis &me ) { if( run ) return; me.mx -= pos.x; me.my -= pos.y; if( fenster ) fenster->doMausEreignis( me ); me.mx += pos.x; me.my += pos.y; } void SpieleKaufenAuswahl::doTastaturEreignis( TastaturEreignis &te ) { if( run ) return; if( fenster ) fenster->doTastaturEreignis( te ); } bool SpieleKaufenAuswahl::tick( double zeit ) { bool rend = ( fenster && !run ) ? fenster->tick( zeit ) : 0; rend |= laden->tick( zeit ); if( ( run || !spielId ) && alpha > 0 ) { if( alpha - zeit * 150 < 0 ) alpha = 0; else alpha -= (unsigned char)( zeit * 150 ); rend = 1; } if( !run && spielId && alpha < 255 ) { if( alpha + zeit * 150 > 255 ) alpha = 255; else alpha += (unsigned char)( zeit * 150 ); rend = 1; } return rend; } void SpieleKaufenAuswahl::render( Bild &zRObj ) { if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getHeight() ) ) return; zRObj.setAlpha( alpha ); ram->render( zRObj ); if( fenster ) fenster->render( zRObj ); zRObj.releaseAlpha(); laden->render( zRObj ); zRObj.releaseDrawOptions(); } // constant // Reference Counting SpieleKaufenAuswahl *SpieleKaufenAuswahl::getThis() { ref++; return this; } SpieleKaufenAuswahl *SpieleKaufenAuswahl::release() { ref--; if( !ref ) delete this; return 0; } // Inhalt der SpieleKaufenListeEintrag Klasse aus SpieleKaufen.h // Konstruktor SpieleKaufenListeEintrag::SpieleKaufenListeEintrag( int id, Schrift *schrift ) { spielId = id; auswählen = initKnopf( 173, 73, 22, 22, 0, 0, "" ); auswählen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Rahmen | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer ); auswählen->setHintergrundBildZ( bilder->get( "shop.ltdb/weiter.png" ) ); initToolTip( auswählen, "Spiel auswählen.", schrift, hauptScreen ); auswählen->setLinienRahmenBreite( 1 ); LTDBDatei *datei = new LTDBDatei(); Text *bdpf = new Text( "data/tmp/shop/kaufen/spiele/" ); bdpf->append( id ); bdpf->append( "/titelbg.ltdb" ); datei->setDatei( bdpf ); hintergrund = datei->laden( 0, new Text( "auswbg.jpg" ) ); datei->release(); ausgewählt = new AlphaFeld(); ausgewählt->setPosition( 1, 1 ); ausgewählt->setSize( 198, 98 ); ausgewählt->setFarbe( 0x0000FF00 ); ausgewählt->setStrength( 10 ); ram = new LRahmen(); ram->setSize( 200, 100 ); ram->setFarbe( 0xFFFFFFFF ); ausw = 0; rend = 0; ref = 1; } // Destruktor SpieleKaufenListeEintrag::~SpieleKaufenListeEintrag() { auswählen->release(); if( hintergrund ) hintergrund->release(); ausgewählt->release(); ram->release(); } // nicht constant void SpieleKaufenListeEintrag::resetAuswahl() { ausw = 0; } bool SpieleKaufenListeEintrag::doMausEreignis( MausEreignis &me ) { bool vera = me.verarbeitet; auswählen->doMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { ausw = 1; return 1; } return 0; } bool SpieleKaufenListeEintrag::tick( double zeit ) { rend |= ausgewählt->tick( zeit ); rend |= auswählen->tick( zeit ); int a = ( ausgewählt->getFarbe() >> 24 ) & 0xFF; if( ausw && a < 255 ) { if( a + 150 * zeit > 255 ) a = 255; else a += (int)( 150 * zeit ); ausgewählt->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( ausgewählt->getFarbe() & 0xFFFFFF ) ); rend = 1; } if( !ausw && a > 0 ) { if( a - 150 * zeit < 0 ) a = 0; else a -= (int)( 150 * zeit ); ausgewählt->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( ausgewählt->getFarbe() & 0xFFFFFF ) ); rend = 1; } bool ret = rend; rend = 0; return ret; } void SpieleKaufenListeEintrag::render( int yOff, Bild &zRObj ) { if( !zRObj.setDrawOptions( 0, yOff, 200, 100 ) ) return; ram->render( zRObj ); if( hintergrund ) zRObj.drawBild( 1, 1, 198, 98, *hintergrund ); ausgewählt->render( zRObj ); auswählen->render( zRObj ); zRObj.releaseDrawOptions(); } // constant int SpieleKaufenListeEintrag::getSpielId() const { return spielId; } // Reference Counting SpieleKaufenListeEintrag *SpieleKaufenListeEintrag::getThis() { ref++; return this; } SpieleKaufenListeEintrag *SpieleKaufenListeEintrag::release() { ref--; if( !ref ) delete this; return 0; } // Inhalt der SpieleKaufenListe Klasse aus SpieleKaufen.h // Konstruktor SpieleKaufenListe::SpieleKaufenListe( Schrift *schrift ) { s = schrift; pos = Punkt( 5, 55 ); ram = new LRahmen(); ram->setSize( 215, 380 ); ram->setFarbe( 0xFFFFFFFF ); einträge = new RCArray< SpieleKaufenListeEintrag >(); vScroll = new VScrollBar(); vScroll->setKlickScroll( 10 ); vScroll->update( 0, 380 ); rend = 0; ref = 1; } // Destruktor SpieleKaufenListe::~SpieleKaufenListe() { s->release(); ram->release(); einträge->release(); vScroll->release(); } // nicht constant void SpieleKaufenListe::ladeSpiele( Array< int > *spiele ) { leeren(); int anz = spiele->getEintragAnzahl(); for( int i = 0; i < anz; i++ ) { if( shopKlient->ladeSpielTitel( spiele->hat( i ) ? spiele->get( i ) : 0 ) ) einträge->add( new SpieleKaufenListeEintrag( spiele->hat( i ) ? spiele->get( i ) : 0, s->getThis() ) ); } vScroll->update( anz * 100, 380 ); rend = 1; } void SpieleKaufenListe::leeren() { cs.lock(); einträge->leeren(); cs.unlock(); vScroll->update( 0, 380 ); rend = 1; } int SpieleKaufenListe::doMausEreignis( MausEreignis &me ) { int mx = me.mx; int my = me.my; me.mx -= pos.x; me.my -= pos.y; vScroll->doMausMessage( 200, 0, 15, 380, me ); me.my += vScroll->getScroll(); int ret = 0; cs.lock(); int anz = einträge->getEintragAnzahl(); for( int i = 0; i < anz; i++ ) { if( einträge->z( i )->doMausEreignis( me ) ) ret = einträge->z( i )->getSpielId(); me.my += 100; } if( ret ) { for( int i = 0; i < anz; i++ ) { if( einträge->z( i )->getSpielId() != ret ) einträge->z( i )->resetAuswahl(); } } cs.unlock(); me.mx = mx; me.my = my; return ret; } bool SpieleKaufenListe::tick( double zeit ) { rend |= vScroll->getRend(); cs.lock(); int anz = einträge->getEintragAnzahl(); for( int i = 0; i < anz; i++ ) rend |= einträge->z( i )->tick( zeit ); cs.unlock(); bool ret = rend; rend = 0; return ret; } void SpieleKaufenListe::render( Bild &zRObj ) { int br = ram->getBreite(); int hö = ram->getHeight(); if( !zRObj.setDrawOptions( pos.x, pos.y, br, hö ) ) return; ram->render( zRObj ); cs.lock(); int anz = einträge->getEintragAnzahl(); for( int i = 0; i < anz; i++ ) einträge->z( i )->render( i * 100 - vScroll->getScroll(), zRObj ); cs.unlock(); vScroll->render( 200, 0, 15, 380, zRObj ); zRObj.releaseDrawOptions(); } // constant int SpieleKaufenListe::getEintragAnzahl() { return einträge->getEintragAnzahl(); } // Reference Counting SpieleKaufenListe *SpieleKaufenListe::getThis() { ref++; return this; } SpieleKaufenListe *SpieleKaufenListe::release() { ref--; if( !ref ) delete this; return 0; } // Inhalt der SpieleKaufen Klasse aus SpieleKaufen.h // Konstruktor SpieleKaufen::SpieleKaufen( Schrift *zSchrift ) : Thread() { Bild *shopZurück = bilder->get( "shop.ltdb/zurück.png" ); if( !shopZurück ) { LTDBDatei *datei = new LTDBDatei(); datei->setDatei( new Text( "data/client/bilder/shop.ltdb" ) ); datei->leseDaten( 0 ); shopZurück = datei->laden( 0, new Text( "zurück.png" ) ); datei->release(); bilder->add( "shop.ltdb/zurück.png", shopZurück->getThis() ); } Bild *shopWeiter = bilder->get( "shop.ltdb/weiter.png" ); if( !shopWeiter ) { LTDBDatei *datei = new LTDBDatei(); datei->setDatei( new Text( "data/client/bilder/shop.ltdb" ) ); datei->leseDaten( 0 ); shopWeiter = datei->laden( 0, new Text( "weiter.png" ) ); datei->release(); bilder->add( "shop.ltdb/weiter.png", shopWeiter->getThis() ); } alpha = 255; sichtbar = 0; suchText = new Text( "" ); ram = new LRahmen(); ram->setSize( 780, 440 ); ram->setFarbe( 0xFFFFFFFF ); pos = Punkt( 10, 50 ); suchFilterT = initTextFeld( 5, 5, 70, 20, zSchrift, TextFeld::Style::Text, "Suchfilter:" ); suchFilter = initTextFeld( 80, 5, 225, 20, zSchrift, TextFeld::Style::TextFeld, "" ); initToolTip( suchFilter, "Gebe etwas vom Namen des Spieles ein, nach dem du suchst.", zSchrift->getThis(), hauptScreen ); suchen = initKnopf( 310, 5, 100, 20, zSchrift, Knopf::Style::Sichtbar, "suchen" ); seiten = initTextFeld( 55, 30, 250, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Seite 0 von 0, 0 Funde." ); zurück = initKnopf( 5, 30, 20, 20, 0, 0, "" ); zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer ); zurück->setHintergrundBildZ( shopZurück ); initToolTip( zurück, "Seite zurück blättern.", zSchrift->getThis(), hauptScreen ); weiter = initKnopf( 30, 30, 20, 20, 0, 0, "" ); weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer ); weiter->setHintergrundBildZ( shopWeiter ); initToolTip( weiter, "Seite weiter blättern.", zSchrift->getThis(), hauptScreen ); liste = new SpieleKaufenListe( zSchrift->getThis() ); auswahl = new SpieleKaufenAuswahl( zSchrift ); laden = ( Framework::Animation2D* )ladeAnimation->dublizieren(); laden->setPosition( 365, 195 ); laden->setSichtbar( 0 ); tickVal = 0; seite = 0; maxSeite = 0; rend = 0; ref = 1; } // Destruktor SpieleKaufen::~SpieleKaufen() { if( run ) warteAufThread( 1000 ); if( run ) ende(); suchText->release(); ram->release(); suchFilter->release(); suchFilterT->release(); suchen->release(); seiten->release(); weiter->release(); zurück->release(); liste->release(); auswahl->release(); laden->release(); } // nicht constant void SpieleKaufen::setSichtbar( bool sicht ) { sichtbar = sicht; if( sichtbar && !liste->getEintragAnzahl() ) { MausEreignis me; me.id = ME_RLinks; me.verarbeitet = 0; me.mx = suchen->getX() + 1 + pos.x; me.my = suchen->getY() + 1 + pos.y; doMausEreignis( me ); } } void SpieleKaufen::thread() { laden->setSichtbar( 1 ); Array< int > *list = shopKlient->suchSpiele( suchText->getText() ); if( !list ) { laden->setSichtbar( 0 ); run = 0; return; } Array< int > *slist = new Array< int >(); int anz = list->getEintragAnzahl(); maxSeite = anz / 10 + 1; if( !( anz % 10 ) ) maxSeite--; while( anz <= seite * 10 && seite > 0 ) seite--; for( int i = seite * 10; i < anz && i < seite * 10 + 10; i++ ) slist->add( list->hat( i ) ? list->get( i ) : 0 ); list->release(); auswahl->reset(); liste->ladeSpiele( slist ); slist->release(); Text *t = new Text( "Seite " ); t->append( maxSeite ? seite + 1 : 0 ); t->append( " von " ); t->append( maxSeite ); t->append( ", " ); t->append( anz ); if( anz == 1 ) t->append( " Fund." ); else t->append( " Funde." ); seiten->setText( t ); zurück->setStyle( TextFeld::Style::Erlaubt, seite > 0 ); weiter->setStyle( TextFeld::Style::Erlaubt, seite + 1 < maxSeite ); laden->setSichtbar( 0 ); run = 0; } void SpieleKaufen::doMausEreignis( MausEreignis &me ) { if( !sichtbar || run ) return; int mx = me.mx; int my = me.my; me.mx -= pos.x; me.my -= pos.y; suchFilter->doMausEreignis( me ); int auswId = liste->doMausEreignis( me ); if( auswId ) auswahl->ladeSpielSeite( auswId ); auswahl->doMausEreignis( me ); int ak = 0; bool tmp = me.verarbeitet; suchen->doMausEreignis( me ); ak = me.verarbeitet ? 1 : 0; zurück->doMausEreignis( me ); ak = me.verarbeitet && !ak ? 2 : ak; weiter->doMausEreignis( me ); ak = me.verarbeitet && !ak ? 3 : ak; if( tmp ) ak = 0; if( me.id == ME_RLinks ) { switch( ak ) { case 1: // Suchen suchText->setText( suchFilter->zText()->getText() ); seite = 1; maxSeite = 1; start(); break; case 2: // Seite zurück blättern seite--; if( seite < 1 ) seite = 1; start(); break; case 3: // Seite vorwärts blättern seite++; if( seite > maxSeite ) seite = maxSeite; start(); break; } } me.mx = mx; me.my = my; } void SpieleKaufen::doTastaturEreignis( TastaturEreignis &te ) { if( !sichtbar || run ) return; bool vera = te.verarbeitet; suchFilter->doTastaturEreignis( te ); if( !vera && te.verarbeitet && te.taste == T_Enter && te.id == TE_Release ) { MausEreignis me; me.id = ME_RLinks; me.verarbeitet = 0; me.mx = suchen->getX() + 1 + pos.x; me.my = suchen->getY() + 1 + pos.y; doMausEreignis( me ); } auswahl->doTastaturEreignis( te ); } bool SpieleKaufen::tick( double zeit ) { rend |= suchFilter->tick( zeit ); rend |= suchFilterT->tick( zeit ); rend |= suchen->tick( zeit ); rend |= weiter->tick( zeit ); rend |= zurück->tick( zeit ); rend |= liste->tick( zeit ); rend |= auswahl->tick( zeit ); rend |= laden->tick( zeit ); tickVal += zeit * 250; int val = (int)tickVal; if( val < 1 ) { bool ret = rend; rend = 0; return ret; } if( val > 10 ) val = 10; tickVal -= val; if( sichtbar && alpha != 255 && !run ) { if( alpha + val > 255 ) alpha = 255; else alpha += val; rend = 1; } if( sichtbar && alpha != 125 && run ) { if( alpha > 125 ) { if( alpha - val < 125 ) alpha = 125; else alpha -= val; rend = 1; } else { if( alpha + val > 125 ) alpha = 125; else alpha += 125; rend = 1; } } if( !sichtbar && alpha != 0 ) { if( alpha - val < 0 ) alpha = 0; else alpha -= val; rend = 1; } bool ret = rend; rend = 0; return ret; } void SpieleKaufen::render( Bild &zRObj ) { if( !alpha ) return; int br = ram->getBreite(); int hö = ram->getHeight(); if( !zRObj.setDrawOptions( pos.x, pos.y, br, hö ) ) return; zRObj.setAlpha( alpha ); ram->render( zRObj ); suchFilterT->render( zRObj ); suchFilter->render( zRObj ); suchen->render( zRObj ); seiten->render( zRObj ); weiter->render( zRObj ); zurück->render( zRObj ); liste->render( zRObj ); auswahl->render( zRObj ); zRObj.releaseAlpha(); laden->render( zRObj ); zRObj.releaseDrawOptions(); } // constant bool SpieleKaufen::istSichtbar() const { return sichtbar; } // Reference Counting SpieleKaufen *SpieleKaufen::getThis() { ref++; return this; } SpieleKaufen *SpieleKaufen::release() { ref--; if( !ref ) delete this; return 0; }