1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042 |
- #include "SpielAuswahl.h"
- #include <Datei.h>
- #include <Text.h>
- #include <Schrift.h>
- #include <Rahmen.h>
- #include <Punkt.h>
- #include <DateiSystem.h>
- #include "..\..\..\Global\Initialisierung.h"
- #include <AlphaFeld.h>
- #include <MausEreignis.h>
- #include <KSGTDatei.h>
- #include "..\..\..\Global\Variablen.h"
- void SpielAuswahlKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
- {
- if( !p )
- return;
- ( (SpielDaten*)p )->ksgsAktion( parameter, retVal );
- }
- SpielDaten::Loader::Loader( SpielDaten *sd, int aktion )
- {
- this->sd = sd;
- this->aktion = aktion;
- beenden = 0;
- ref = 2;
- start();
- }
- void SpielDaten::Loader::setBeenden()
- {
- beenden = 1;
- }
- void SpielDaten::Loader::thread()
- {
- Text *pfad = new Text( "data/spiele/" );
- pfad->append( sd->name->getText() );
- pfad->append( "/data/game.ini" );
- if( !DateiExistiert( pfad->getThis() ) )
- {
- if( !aktion )
- {
- if( sd->aAnimation )
- sd->aAnimation->setSichtbar( 0 );
- sd->geladen = 0;
- sd->ausgewählt = 0;
- hauptScreen->lock();
- if( sd->aAnimation )
- sd->aAnimation = sd->aAnimation->release();
- hauptScreen->unlock();
- if( sd->hintergrund )
- sd->hintergrund = sd->hintergrund->release();
- if( sd->beschreibung )
- {
- sd->beschreibung->zurücksetzen();
- sd->beschreibung = sd->beschreibung->release();
- }
- if( sd->ksgs )
- {
- dllDateien->releaseDLL( "KSGScript.dll" );
- sd->ksgs = 0;
- }
- }
- else
- {
- if( !sd->hintergrund )
- sd->hintergrund = new Bild();
- sd->hintergrund->neuBild( 200, 100, 0xFF000000 );
- sd->schrift->lock();
- sd->schrift->setSchriftSize( 12 );
- sd->schrift->setDrawPosition( 10, 10 );
- sd->schrift->renderText( sd->name, *sd->hintergrund, 0xFFFFFFFF );
- sd->schrift->unlock();
- if( !sd->geladen )
- sd->geladen = 1;
- sd->rend = 1;
- int dgId = infoKlient->getDateiGruppeIdVonSpiel( sd->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 );
- zeile->release();
- }
- else
- idT->release();
- }
- dg->speichern();
- dg->release();
- }
- if( aktion == 2 && !beenden )
- {
- if( sd->beschreibung )
- {
- sd->beschreibung->zurücksetzen();
- sd->beschreibung = sd->beschreibung->release();
- }
- if( !sd->ksgs )
- sd->ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
- if( sd->ksgs )
- {
- KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( sd->ksgs, KSGS_START_FUNKTION );
- if( getKSGScript )
- {
- sd->beschreibung = getKSGScript();
- sd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
- sd->beschreibung->setSchriftZ( sd->schrift->getThis() );
- sd->beschreibung->setSize( 578, 428 );
- sd->beschreibung->setRückrufParam( sd );
- sd->beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
- sd->beschreibung->setScriptDatei( "data/script/SpielNichtAktuell.ksgs" );
- }
- else
- {
- 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
- {
- 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 );
- }
- if( sd->beschreibung )
- sd->geladen = 2;
- if( sd->beschreibung && sd->ksgs && sd->ausgewählt )
- sd->beschreibung->neuLaden();
- }
- }
- pfad->release();
- sd->rend = 1;
- return;
- }
- Datei *ini = new Datei();
- ini->setDatei( pfad->getText() );
- ini->open( Datei::Style::lesen );
- if( !aktion )
- {
- if( sd->aAnimation )
- sd->aAnimation->setSichtbar( 0 );
- sd->geladen = 0;
- sd->ausgewählt = 0;
- hauptScreen->lock();
- if( sd->aAnimation )
- sd->aAnimation = sd->aAnimation->release();
- hauptScreen->unlock();
- if( sd->hintergrund )
- sd->hintergrund = sd->hintergrund->release();
- if( sd->beschreibung )
- {
- sd->beschreibung->zurücksetzen();
- sd->beschreibung = sd->beschreibung->release();
- }
- if( sd->ksgs )
- {
- dllDateien->releaseDLL( "KSGScript.dll" );
- sd->ksgs = 0;
- }
- sd->rend = 1;
- }
- else
- {
- Text *pf = ini->leseZeile();
- pf->remove( pf->getLength() - 1 );
- pf->insert( 0, "/bilder/" );
- pf->insert( 0, sd->name->getText() );
- pf->insert( 0, "data/spiele/" );
- if( pf->hat( ".ltdb/" ) )
- {
- if( !sd->hintergrund )
- {
- LTDBDatei *bildDatei = new LTDBDatei();
- bildDatei->setDatei( pf->getTeilText( 0, pf->positionVon( ".ltdb" ) + 5 ) );
- bildDatei->leseDaten( 0 );
- sd->hintergrund = bildDatei->laden( 0, pf->getTeilText( pf->positionVon( ".ltdb" ) + 6 ) );
- bildDatei->release();
- }
- }
- else
- {
- if( !sd->hintergrund )
- {
- LTDBDatei *bildDatei = new LTDBDatei();
- bildDatei->setDatei( pf->getThis() );
- bildDatei->leseDaten( 0 );
- sd->hintergrund = bildDatei->laden( 0, bildDatei->zBildListe()->get( 0 ) );
- bildDatei->release();
- }
- }
- pf->release();
- pf = ini->leseZeile();
- pf->release();
- pf = ini->leseZeile();
- pf->remove( pf->getLength() - 1 );
- pf->insert( 0, "/data/" );
- pf->insert( 0, sd->name->getText() );
- pf->insert( 0, "data/spiele/" );
- Datei *idDatei = new Datei();
- idDatei->setDatei( pf->getText() );
- idDatei->open( Datei::Style::lesen );
- idDatei->lese( (char*)&sd->spielId, 4 );
- idDatei->close();
- idDatei->release();
- pf->release();
- if( !sd->geladen )
- sd->geladen = 1;
- sd->rend = 1;
- ini->setLPosition( 0, 0 );
- if( aktion == 2 && !beenden )
- {
- pf = ini->leseZeile();
- pf->remove( pf->getLength() - 1 );
- pf->insert( 0, "/bilder/" );
- pf->insert( 0, sd->name->getText() );
- pf->insert( 0, "data/spiele/" );
- if( !pf->hat( ".ltdb/" ) )
- {
- hauptScreen->lock();
- if( sd->aAnimation )
- sd->aAnimation = sd->aAnimation->release();
- hauptScreen->unlock();
- LTDBDatei *add = new LTDBDatei();
- add->setDatei( pf->getThis() );
- add->leseDaten( 0 );
- Animation2DData *ad = new Animation2DData();
- ad->ladeAnimation( add );
- ad->setWiederhohlend( 1 );
- ad->setFPS( 30 );
- sd->aAnimation = new Animation2D();
- sd->aAnimation->setSize( 200, 100 );
- sd->aAnimation->setPosition( 0, 0 );
- sd->aAnimation->setAnimationDataZ( ad );
- }
- pf->release();
- pf = ini->leseZeile();
- pf->remove( pf->getLength() - 1 );
- pf->insert( 0, "/data/" );
- pf->insert( 0, sd->name->getText() );
- pf->insert( 0, "data/spiele/" );
- if( sd->beschreibung )
- {
- sd->beschreibung->zurücksetzen();
- sd->beschreibung = sd->beschreibung->release();
- }
- if( !sd->ksgs )
- sd->ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
- if( sd->ksgs )
- {
- KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( sd->ksgs, KSGS_START_FUNKTION );
- if( getKSGScript )
- {
- sd->beschreibung = getKSGScript();
- sd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
- sd->beschreibung->setSchriftZ( sd->schrift->getThis() );
- sd->beschreibung->setSize( 578, 428 );
- sd->beschreibung->setRückrufParam( sd );
- sd->beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
- sd->beschreibung->setScriptDatei( pf->getText() );
- }
- else
- {
- 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
- {
- 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 );
- }
- pf->release();
- if( sd->beschreibung )
- sd->geladen = 2;
- if( sd->beschreibung && sd->ksgs && sd->ausgewählt )
- sd->beschreibung->neuLaden();
- sd->rend = 1;
- }
- }
- pfad->release();
- ini->close();
- ini->release();
- if( !sd->erlaubt )
- sd->updateErlaubt();
- sd->rend = 1;
- release();
- }
- SpielDaten::Loader *SpielDaten::Loader::release()
- {
- if( !--ref )
- delete this;
- return 0;
- }
- int SpielDaten::Loader::getAktion() const
- {
- return aktion;
- }
- // Inhalt der SpielDaten Klasse aus SpielAuswahl.h
- // Konstruktor
- SpielDaten::SpielDaten( Schrift *zSchrift, const char *name, int id )
- {
- this->name = new Text( name );
- hintergrund = 0;
- aAnimation = 0;
- beschreibung = 0;
- ksgs = 0;
- rahmen = new LRahmen();
- rahmen->setFarbe( 0xFFFFFFFF );
- rahmen->setRamenBreite( 1 );
- tickVal = 0;
- animation = 0;
- ausgewählt = 0;
- pos = Punkt( 0, 500 );
- gr = Punkt( 200, 100 );
- schrift = zSchrift->getThis();
- spielId = id;
- geladen = 0;
- erlaubt = 0;
- auswahl = new AlphaFeld();
- auswahl->setFarbe( 0x0000FF00 );
- auswahl->setStrength( 8 );
- auswahl->setSize( 200, 100 );
- ladenBild = 0;
- rend = 0;
- ref = 1;
- alpha = 0;
- tAlpha = 0;
- loader = new Loader( this, 1 );
- }
- // Destruktor
- SpielDaten::~SpielDaten()
- {
- if( loader && loader->isRunning() )
- loader->warteAufThread( INT_MAX );
- loader->release();
- if( schrift )
- schrift->release();
- name->release();
- if( hintergrund )
- hintergrund->release();
- if( aAnimation )
- aAnimation->release();
- if( beschreibung )
- {
- beschreibung->zurücksetzen();
- beschreibung->release();
- }
- if( ksgs )
- {
- dllDateien->releaseDLL( "KSGScript.dll" );
- ksgs = 0;
- }
- rahmen->release();
- auswahl->release();
- }
- // nicht constant
- void SpielDaten::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
- {}
- void SpielDaten::setSichtbar( bool sichtbar )
- {
- if( sichtbar )
- animation |= 0x1;
- else
- {
- animation &= ~0x1;
- setAuswahl( 0 );
- auswahl->setFarbe( auswahl->getFarbe() & 0xFFFFFF );
- }
- if( !erlaubt && sichtbar && ausgewählt )
- updateH->setSichtbar( spielId, 1 );
- hauptScreen->lock();
- if( loader->getAktion() == (sichtbar ? 2 : 0) )
- {
- hauptScreen->unlock();
- rend = 1;
- return;
- }
- loader->setBeenden();
- Loader *altLoader = loader;
- loader = new Loader( this, sichtbar ? 2 : 0 );
- altLoader->release();
- hauptScreen->unlock();
- rend = 1;
- }
- void SpielDaten::setSichtbar()
- {
- animation |= 1;
- if( ausgewählt && geladen == 2 )
- {
- animation |= 0x4;
- beschreibung->setPosition( beschreibung->getX(), 0 );
- }
- if( !erlaubt && ausgewählt )
- updateH->setSichtbar( spielId, 1 );
- hauptScreen->lock();
- if( geladen != 2 && loader->getAktion() != 2 )
- {
- Loader *altLoader = loader;
- loader = new Loader( this, 2 );
- altLoader->release();
- }
- hauptScreen->unlock();
- rend = 1;
- }
- void SpielDaten::setAuswahl( bool auswahl )
- {
- if( ausgewählt == auswahl )
- return;
- ausgewählt = auswahl;
- if( auswahl )
- {
- if( aAnimation )
- aAnimation->setSichtbar( 1 );
- if( beschreibung && ksgs )
- beschreibung->neuLaden();
- animation |= 0x4;
- }
- else
- animation &= ~0x4;
- if( !erlaubt && ausgewählt )
- updateH->setSichtbar( spielId, 1 );
- if( !erlaubt && !ausgewählt )
- updateH->setSichtbar( spielId, 0 );
- rend = 1;
- }
- void SpielDaten::updateErlaubt()
- {
- bool update = erlaubt;
- erlaubt = 0;
- KSGTDatei *dgt = new KSGTDatei( "data/dg.ksgt" );
- dgt->laden();
- bool ak = 0;
- int dgId = infoKlient->getDateiGruppeIdVonSpiel( spielId );
- for( int i = 0; i < dgt->getZeilenAnzahl(); i++ )
- {
- if( dgt->zFeld( i, 0 ) && TextZuInt( dgt->zFeld( i, 0 )->getText(), 10 ) == dgId )
- {
- int lv = dgt->zFeld( i, 2 ) ? TextZuInt( dgt->zFeld( i, 2 )->getText(), 10 ) : 0;
- int ov = infoKlient->getSpielVersion( spielId );
- if( lv == ov )
- ak = 1;
- break;
- }
- }
- dgt->release();
- erlaubt = ak && infoKlient->istSpielErlaubt( spielId );
- if( !erlaubt && !updateH->hat( spielId ) )
- {
- updateH->erstellen( schrift, spielId );
- if( ausgewählt )
- updateH->setSichtbar( spielId, 1 );
- }
- if( erlaubt && updateH->hat( spielId ) )
- updateH->remove( spielId, 0 );
- }
- void SpielDaten::setPosition( int lPos )
- {
- pos.y = lPos * 100;
- rend = 1;
- }
- bool SpielDaten::tick( double tickVal )
- {
- if( beschreibung )
- rend |= beschreibung->tick( tickVal );
- if( !erlaubt )
- rend |= updateH->tick( spielId, tickVal );
- this->tickVal += tickVal * 500;
- int val = ( int ) this->tickVal;
- if( val < 1 )
- {
- bool ret = rend;
- rend = 0;
- return ret;
- }
- if( val > 17 )
- val = 17;
- this->tickVal -= val;
- if( aAnimation && geladen == 2 && aAnimation->istSichtbar() )
- {
- if( aAnimation->getJetzt() + 1 >= aAnimation->zAnimationData()->getBildAnzahl() )
- {
- rend |= aAnimation->tick( tickVal );
- if( aAnimation->getJetzt() + 1 < aAnimation->zAnimationData()->getBildAnzahl() )
- aAnimation->setSichtbar( 0 );
- }
- else
- rend |= aAnimation->tick( tickVal );
- }
- if( ausgewählt )
- {
- int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
- if( a != 150 )
- {
- if( a + val > 150 )
- a = 150;
- else
- a += val;
- auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
- rend = 1;
- }
- }
- else
- {
- int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
- if( a != 0 )
- {
- if( a - val < 0 )
- a = 0;
- else
- a -= val;
- auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
- rend = 1;
- }
- }
- if( ( animation | 0x1 ) == animation ) // sichtbar
- {
- if( tAlpha != 255 )
- {
- if( tAlpha + val > 255 )
- tAlpha = 255;
- else
- tAlpha += val;
- rend = 1;
- }
- }
- else // unsichtbar
- {
- if( tAlpha != 0 )
- {
- if( tAlpha - val < 0 )
- tAlpha = 0;
- else
- tAlpha -= val;
- rend = 1;
- }
- }
- if( geladen == 2 )
- {
- if( ( animation | 0x4 ) == animation ) // auswählen
- {
- if( beschreibung )
- {
- if( alpha != 255 )
- {
- if( alpha + val < 255 )
- alpha += val;
- else
- alpha = 255;
- rend = 1;
- }
- }
- }
- else // abwählen
- {
- int a = ( auswahl->getFarbe() >> 24 ) & 0xFF;
- if( a != 0 )
- {
- a -= val;
- if( a < 0 )
- a = 0;
- auswahl->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( auswahl->getFarbe() & 0xFFFFFF ) );
- rend = 1;
- }
- if( beschreibung )
- {
- if( alpha != 0 )
- {
- if( alpha - val > 0 )
- alpha -= val;
- else
- alpha = 0;
- rend = 1;
- }
- }
- }
- }
- bool ret = rend;
- rend = 0;
- return ret;
- }
- void SpielDaten::doMausEreignis( MausEreignis &me )
- {
- if( !erlaubt && ausgewählt )
- {
- me.mx -= gr.x + 90;
- me.my -= 350;
- updateH->doMausEreignis( spielId, me );
- me.my += 350;
- me.mx += 90;
- if( beschreibung )
- beschreibung->doMausEreignis( me );
- me.mx += gr.x;
- }
- }
- void SpielDaten::render( Bild &zRObj )
- {
- int x = pos.x;
- int y = pos.y;
- int br = gr.x;
- int hö = gr.y;
- if( !zRObj.setDrawOptions( x, y, br, hö ) )
- return;
- zRObj.setAlpha( tAlpha );
- rahmen->setSize( br, hö );
- int rbr = rahmen->getRBreite();
- if( geladen && hintergrund && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
- zRObj.drawBild( rbr, rbr, br - rbr * 2, hö - rbr * 2, *hintergrund );
- if( aAnimation )
- aAnimation->render( zRObj );
- rahmen->render( zRObj );
- if( auswahl && ( ( auswahl->getFarbe() >> 24 ) & 0xFF ) && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
- {
- auswahl->setPosition( rbr, rbr );
- auswahl->setSize( br - rbr * 2, hö - rbr * 2 );
- auswahl->render( zRObj );
- }
- zRObj.releaseDrawOptions();
- x = br;
- y = 0;
- br = 580;
- hö = 480;
- if( !zRObj.setDrawOptions( x, y, br, hö ) )
- {
- zRObj.releaseAlpha();
- return;
- }
- if( geladen == 2 && beschreibung )
- {
- zRObj.setAlpha( alpha );
- beschreibung->render( zRObj );
- zRObj.releaseAlpha();
- }
- if( !erlaubt )
- updateH->render( spielId, 90, 350, zRObj );
- if( ausgewählt && geladen != 2 && ladeAnimation->zAnimationData() )
- {
- ladenBild++;
- if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
- ladenBild = 0;
- zRObj.drawBild( 275, 195, 50, 50, *ladeAnimation->zAnimationData()->zBild( ladenBild ) );
- rend = 1;
- }
- zRObj.releaseDrawOptions();
- zRObj.releaseAlpha();
- }
- // constant
- int SpielDaten::getSpielId() const
- {
- return spielId;
- }
- bool SpielDaten::istausgewählt() const
- {
- return ausgewählt;
- }
- Text *SpielDaten::zName() const
- {
- return name;
- }
- bool SpielDaten::istErlaubt() const
- {
- return erlaubt;
- }
- // Reference Counting
- SpielDaten *SpielDaten::getThis()
- {
- ref++;
- return this;
- }
- SpielDaten *SpielDaten::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
- // Inhalt der SpielAuswahl Klasse aus SpielAuswahl.h
- // Konstruktor
- SpielAuswahlFenster::SpielAuswahlFenster( Schrift *zSchrift )
- : Thread()
- {
- schrift = zSchrift->getThis();
- rahmen = new LRahmen();
- rahmen->setFarbe( 0xFFFFFFFF );
- rahmen->setRamenBreite( 1 );
- rahmen->setSize( 760, 500 );
- members = new RCArray< SpielDaten >();
- anzahl = 0;
- animation = 0;
- auswahl = -1;
- tickVal = 0;
- seite = 0;
- pos = Punkt( 10, 10 );
- gr = Punkt( 780, 430 );
- rend = 0;
- ref = 1;
- alpha = 0;
- start();
- }
- // Destruktor
- SpielAuswahlFenster::~SpielAuswahlFenster()
- {
- if( run )
- {
- warteAufThread( 5000 );
- ende();
- }
- if( schrift )
- schrift->release();
- if( rahmen )
- rahmen->release();
- if( members )
- members->release();
- }
- // nicht constant
- void SpielAuswahlFenster::setSichtbar( bool sichtbar )
- {
- if( sichtbar )
- {
- animation |= 0x1;
- start();
- }
- else
- {
- auswahl = -1;
- for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
- members->z( i )->setSichtbar( 0 );
- animation &= ~0x1;
- }
- rend = 1;
- }
- void SpielAuswahlFenster::blättern( bool oben )
- {
- for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
- members->z( i )->setSichtbar( 0 );
- seite += oben ? 1 : -1;
- for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
- {
- members->z( i )->setPosition( i % 4 );
- members->z( i )->setSichtbar( 1 );
- }
- auswahl = -1;
- rend = 1;
- }
- void SpielAuswahlFenster::updateListe()
- {
- if( run )
- return;
- start();
- }
- void SpielAuswahlFenster::thread()
- {
- Array< int > *liste = infoKlient->getAccountSpielArtListe();
- if( !liste )
- {
- nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( infoKlient->getLetzterFehler() ),
- new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
- run = 0;
- return;
- }
- int anz = liste->getEintragAnzahl();
- for( int i = 0; i < anz; i++ )
- {
- Text *name = infoKlient->getSpielName( liste->hat( i ) ? liste->get( i ) : 0 );
- if( name )
- {
- bool gefunden = 0;
- for( int j = 0; j < anzahl; j++ )
- {
- SpielDaten *tmp = members->z( j );
- if( liste->hat( i ) && tmp->getSpielId() == liste->get( i ) )
- {
- gefunden = 1;
- break;
- }
- }
- if( !gefunden )
- {
- SpielDaten *tmp = new SpielDaten( schrift, name->getText(), liste->hat( i ) ? liste->get( i ) : 0 );
- members->add( tmp, anzahl );
- anzahl++;
- }
- name->release();
- }
- }
- if( liste )
- liste->release();
- for( int i = 0; i < anzahl; i++ )
- members->z( i )->updateErlaubt();
- for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
- {
- members->z( i )->setPosition( i % 4 );
- members->z( i )->setSichtbar();
- }
- rend = 1;
- run = 0;
- }
- bool SpielAuswahlFenster::tick( double tickVal )
- {
- for( int i = 0; i < anzahl; i++ )
- rend |= members->z( i )->tick( tickVal );
- this->tickVal += tickVal * 750;
- int val = ( int )this->tickVal;
- if( val < 1 )
- {
- bool ret = rend;
- rend = 0;
- return ret;
- }
- if( val > 25 )
- val = 25;
- this->tickVal -= val;
- if( ( animation | 0x1 ) == animation ) // sichtbar
- {
- if( alpha < 255 )
- {
- if( alpha + val >= 255 )
- {
- alpha = 255;
- for( int i = seite * 4; i < anzahl && i >= 0 && i < seite * 4 + 4; i++ )
- {
- members->z( i )->setPosition( i % 4 );
- members->z( i )->setSichtbar( 1 );
- }
- }
- else
- alpha += val;
- rend = 1;
- }
- }
- else // unsichtbar
- {
- if( alpha > 0 )
- {
- if( alpha - val < 0 )
- alpha = 0;
- else
- alpha -= val;
- rend = 1;
- }
- }
- bool ret = rend;
- rend = 0;
- return ret;
- }
- void SpielAuswahlFenster::doMausEreignis( MausEreignis &me )
- {
- if( pos.x != 10 )
- return;
- me.mx -= pos.x;
- me.my -= pos.y;
- for( int i = 0; i < anzahl; i++ )
- members->z( i )->doMausEreignis( me );
- if( me.mx < 0 || me.my < 0 )
- {
- me.mx += pos.x;
- me.my += pos.y;
- return;
- }
- if( me.mx > 200 || me.my > getAnzahlAufSeite() * 100 )
- {
- me.mx += pos.x;
- me.my += pos.y;
- return;
- }
- if( me.id == ME_RLinks )
- {
- int treffer = me.my / 100 + seite * 4;
- if( treffer >= anzahl )
- {
- me.mx += pos.x;
- me.my += pos.y;
- return;
- }
- if( treffer == auswahl )
- {
- me.mx += pos.x;
- me.my += pos.y;
- return;
- }
- if( auswahl >= 0 )
- members->z( auswahl )->setAuswahl( 0 );
- members->z( treffer )->setAuswahl( 1 );
- auswahl = treffer;
- rend = 1;
- }
- me.mx += pos.x;
- me.my += pos.y;
- }
- void SpielAuswahlFenster::render( Bild &zrObj )
- {
- int x = pos.x;
- int y = pos.y;
- int br = gr.x;
- int hö = gr.y;
- if( !zrObj.setDrawOptions( x, y, br, hö ) )
- return;
- zrObj.setAlpha( alpha );
- rahmen->setSize( br, hö );
- rahmen->render( zrObj );
- int rbr = rahmen->getRBreite();
- if( !zrObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
- {
- zrObj.releaseDrawOptions();
- zrObj.releaseAlpha();
- return;
- }
- for( int i = seite * 4; i >= 0 && i < anzahl && i < seite * 4 + 4; i++ )
- members->z( i )->render( zrObj );
- zrObj.releaseDrawOptions();
- if( !anzahl )
- {
- Text t = "Dieser Account besitzt momentan noch keine Spiele.\nBesuche den Shop um neue Spiele zu erwerben!";
- schrift->lock();
- schrift->setDrawPosition( 10, 10 );
- schrift->setSchriftSize( 12 );
- schrift->renderText( &t, zrObj, 0xFFFFFFFF );
- schrift->unlock();
- }
- zrObj.releaseDrawOptions();
- zrObj.releaseAlpha();
- }
- // constant
- int SpielAuswahlFenster::getAnzahl() const
- {
- return anzahl;
- }
- int SpielAuswahlFenster::getSeiteAnzahl() const
- {
- return ( anzahl / 4.0 == anzahl / 4 ) ? ( anzahl / 4 ) : ( anzahl / 4 + 1 );
- }
- int SpielAuswahlFenster::getSeite() const
- {
- return seite;
- }
- int SpielAuswahlFenster::getAnzahlAufSeite() const
- {
- return ( anzahl < seite * 4 + 4 ) ? ( anzahl - seite * 4 ) : 4;
- }
- bool SpielAuswahlFenster::hatAuswahl() const
- {
- return auswahl != -1;
- }
- SpielDaten *SpielAuswahlFenster::getAuswahl() const
- {
- return members->get( auswahl );
- }
- SpielDaten *SpielAuswahlFenster::zAuswahl() const
- {
- return members->z( auswahl );
- }
- bool SpielAuswahlFenster::istAuswahlErlubt() const
- {
- return auswahl != -1 && members->z( auswahl )->istErlaubt();
- }
- // Reference Counting
- SpielAuswahlFenster *SpielAuswahlFenster::getThis()
- {
- ref++;
- return this;
- }
- SpielAuswahlFenster *SpielAuswahlFenster::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
|