Browse Source

Fehler behoben, welcher in der Spiel oder Karten Auswahl einen Absturtz veruhrsachen konnte (in ganz seltenen fällen)

Kolja Strohm 6 years ago
parent
commit
2d6ccb2951

+ 3 - 3
KSGClient/KSGClient.vcxproj

@@ -73,18 +73,18 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <LinkIncremental>true</LinkIncremental>
-    <IncludePath>..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;..\..\Include;..\..\..\..\Allgemein\GSL\GSL\Include;..\..\..\..\Allgemein\ksgScript\ksgScript\Include;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\..\..\OpenSSL\x64\Debug\Include;..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;..\..\Include;..\..\..\..\Allgemein\GSL\GSL\Include;..\..\..\..\Allgemein\ksgScript\ksgScript\Include;$(IncludePath)</IncludePath>
     <LibraryPath>..\..\..\..\Allgemein\Framework\x64\Debug;..\..\..\..\Allgemein\Network\x64\Debug;$(LibraryPath)</LibraryPath>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <LinkIncremental>false</LinkIncremental>
     <LibraryPath>..\..\..\..\Allgemein\Framework\Release;..\..\..\..\Allgemein\Network\Release;$(LibraryPath)</LibraryPath>
-    <IncludePath>..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;..\..\Include;..\..\..\..\Allgemein\GSL\GSL\Include;..\..\..\..\Allgemein\ksgScript\ksgScript\Include;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\..\..\OpenSSL\x32\Release\Include;..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;..\..\Include;..\..\..\..\Allgemein\GSL\GSL\Include;..\..\..\..\Allgemein\ksgScript\ksgScript\Include;$(IncludePath)</IncludePath>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <LinkIncremental>false</LinkIncremental>
     <LibraryPath>..\..\..\..\Allgemein\Framework\x64\Release;..\..\..\..\Allgemein\Network\x64\Release;$(LibraryPath)</LibraryPath>
-    <IncludePath>..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;..\..\Include;..\..\..\..\Allgemein\GSL\GSL\Include;..\..\..\..\Allgemein\ksgScript\ksgScript\Include;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\..\..\OpenSSL\x64\Release\Include;..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;..\..\Include;..\..\..\..\Allgemein\GSL\GSL\Include;..\..\..\..\Allgemein\ksgScript\ksgScript\Include;$(IncludePath)</IncludePath>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>

+ 113 - 95
KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.cpp

@@ -19,6 +19,107 @@ void KarteAuswahlKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVa
     ( (KarteDaten*)p )->ksgsAktion( parameter, retVal );
 }
 
+
+KarteDaten::Loader::Loader( KarteDaten *kd, int aktion )
+{
+    this->aktion = aktion;
+    this->kd = kd;
+    ref = 2;
+    start();
+}
+
+void KarteDaten::Loader::thread()
+{
+    if( !aktion )
+    {
+        kd->geladen = 0;
+        if( kd->hintergrund )
+            kd->hintergrund = kd->hintergrund->release();
+        if( kd->beschreibung )
+        {
+            kd->beschreibung->zurücksetzen();
+            kd->beschreibung = kd->beschreibung->release();
+        }
+        kd->rend = 1;
+        if( kd->ksgs )
+        {
+            dllDateien->releaseDLL( "KSGScript.dll" );
+            kd->ksgs = 0;
+        }
+    }
+    else
+    {
+        KartenLeser *mapReader = new KartenLeser();
+        mapReader->setKarteId( kd->karteId );
+        if( !kd->hintergrund )
+            kd->hintergrund = mapReader->getKartenTitelBild( kd->schrift );
+        if( !kd->geladen )
+            kd->geladen = 1;
+        kd->rend = 1;
+        if( aktion == 2 )
+        {
+            if( !mapReader->getKartenBeschreibung() )
+                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Beschreibung nicht gefunden." ), new Text( "Ok" ) );
+            if( kd->beschreibung )
+            {
+                kd->beschreibung->zurücksetzen();
+                kd->beschreibung = kd->beschreibung->release();
+            }
+            if( !kd->ksgs )
+                kd->ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
+            if( kd->ksgs )
+            {
+                KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( kd->ksgs, KSGS_START_FUNKTION );
+                if( getKSGScript )
+                {
+                    kd->beschreibung = getKSGScript();
+                    kd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
+                    kd->beschreibung->setSchriftZ( kd->schrift->getThis() );
+                    kd->beschreibung->setSize( 578, 428 );
+                    kd->beschreibung->setRückrufParam( kd );
+                    kd->beschreibung->setRückrufFunktion( KarteAuswahlKSGSAktion );
+                    Text *pf = mapReader->getKartePfad();
+                    *pf += "beschreibung.ksgs";
+                    kd->beschreibung->setScriptDatei( pf );
+                }
+                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( kd->beschreibung )
+                kd->geladen = 2;
+            kd->rend = 1;
+        }
+        mapReader->release();
+    }
+    if( !kd->erlaubt )
+        kd->updateErlaubt();
+    kd->rend = 1;
+    release();
+}
+
+KarteDaten::Loader *KarteDaten::Loader::release()
+{
+    if( !--ref )
+        delete this;
+    return 0;
+};
+
+int KarteDaten::Loader::getAction() const
+{
+    return aktion;
+}
+
 // Inhalt der KarteDaten Klasse aus KarteAuswahl.h
 // Konstruktor
 KarteDaten::KarteDaten( Schrift *zSchrift, int id )
@@ -36,7 +137,6 @@ KarteDaten::KarteDaten( Schrift *zSchrift, int id )
     gr = Punkt( 200, 100 );
     schrift = zSchrift->getThis();
     karteId = id;
-    aktion = 1;
     geladen = 0;
     auswahl = new AlphaFeld();
     auswahl->setFarbe( 0x0000FF00 );
@@ -48,16 +148,15 @@ KarteDaten::KarteDaten( Schrift *zSchrift, int id )
     tAlpha = 0;
     alpha = 0;
     ref = 1;
-    start();
+    loader = new Loader( this, 1 );
 }
 
 // Destruktor
 KarteDaten::~KarteDaten()
 {
-    if( run )
-        this->warteAufThread( 5000 );
-    if( run )
-        ende();
+    if( loader && loader->isRunning() )
+        loader->warteAufThread( INT_MAX );
+    loader->release();
     if( schrift )
         schrift->release();
     if( hintergrund )
@@ -77,87 +176,6 @@ KarteDaten::~KarteDaten()
 }
 
 // nicht constant
-void KarteDaten::thread()
-{
-    if( !aktion )
-    {
-        geladen = 0;
-        if( hintergrund )
-            hintergrund = hintergrund->release();
-        if( beschreibung )
-        {
-            beschreibung->zurücksetzen();
-            beschreibung = beschreibung->release();
-        }
-        rend = 1;
-        if( ksgs )
-        {
-            dllDateien->releaseDLL( "KSGScript.dll" );
-            ksgs = 0;
-        }
-    }
-    else
-    {
-        KartenLeser *mapReader = new KartenLeser();
-        mapReader->setKarteId( karteId );
-        if( !hintergrund )
-            hintergrund = mapReader->getKartenTitelBild( schrift );
-        if( !geladen )
-            geladen = 1;
-        rend = 1;
-        if( aktion == 2 )
-        {
-            if( !mapReader->getKartenBeschreibung() )
-                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Beschreibung nicht gefunden." ), new Text( "Ok" ) );
-            if( beschreibung )
-            {
-                beschreibung->zurücksetzen();
-                beschreibung = beschreibung->release();
-            }
-            if( !ksgs )
-                ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
-            if( ksgs )
-            {
-                KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( ksgs, KSGS_START_FUNKTION );
-                if( getKSGScript )
-                {
-                    beschreibung = getKSGScript();
-                    beschreibung->setBildschirmZ( hauptScreen->getThis() );
-                    beschreibung->setSchriftZ( schrift->getThis() );
-                    beschreibung->setSize( 578, 428 );
-                    beschreibung->setRückrufParam( this );
-                    beschreibung->setRückrufFunktion( KarteAuswahlKSGSAktion );
-                    Text *pf = mapReader->getKartePfad();
-                    *pf += "beschreibung.ksgs";
-                    beschreibung->setScriptDatei( pf );
-                }
-                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( beschreibung )
-                geladen = 2;
-            rend = 1;
-        }
-        mapReader->release();
-    }
-    aktion = 0;
-    if( !erlaubt )
-        updateErlaubt();
-    run = 0;
-    rend = 1;
-}
-
 void KarteDaten::updateErlaubt()
 {
     if( geladen != 2 )
@@ -212,11 +230,11 @@ void KarteDaten::setSichtbar( bool sichtbar )
         animation &= ~0x1;
         setAuswahl( 0 );
     }
-    if( sichtbar )
+    if( sichtbar && geladen != 2 && loader->getAction() != 2 )
     {
-        warteAufThread( 1000 );
-        aktion = 2;
-        start();
+        Loader *altLoader = loader;
+        loader = new Loader( this, 2 );
+        altLoader->release();
     }
     rend = 1;
 }
@@ -229,11 +247,11 @@ void KarteDaten::setSichtbar()
         animation |= 0x4;
         beschreibung->setPosition( beschreibung->getX(), 0 );
     }
-    if( geladen != 2 )
+    if( geladen != 2 && loader->getAction() != 2 )
     {
-        warteAufThread( 1000 );
-        aktion = 2;
-        start();
+        Loader *altLoader = loader;
+        loader = new Loader( this, 2 );
+        altLoader->release();
     }
     rend = 1;
 }

+ 86 - 74
KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.h

@@ -10,96 +10,108 @@
 using namespace Framework;
 using namespace KSGScript;
 
-class KarteDaten : public Thread
+class KarteDaten
 {
 private:
-	int karteId;
-	Schrift *schrift;
-	Bild *hintergrund;
+    class Loader : public Thread
+    {
+    private:
+        KarteDaten * kd;
+        int aktion;
+        int ref;
+    public:
+        Loader( KarteDaten *kd, int aktion );
+        void thread() override;
+        Loader *release();
+        int getAction() const;
+    };
+    Loader *loader;
+    int karteId;
+    Schrift *schrift;
+    Bild *hintergrund;
     HINSTANCE ksgs;
-	KSGScriptObj *beschreibung;
-	LRahmen *rahmen;
-	double tickVal;
-	int animation;
-	bool ausgewählt;
-	Punkt pos;
-	Punkt gr;
-	int geladen;
-	int aktion;
-	AlphaFeld *auswahl;
-	unsigned char auswAlpha;
-	bool erlaubt;
-	bool rend;
+    KSGScriptObj *beschreibung;
+    LRahmen *rahmen;
+    double tickVal;
+    int animation;
+    bool ausgewählt;
+    Punkt pos;
+    Punkt gr;
+    int geladen;
+    AlphaFeld *auswahl;
+    unsigned char auswAlpha;
+    bool erlaubt;
+    bool rend;
     unsigned char tAlpha;
     unsigned char alpha;
-	int ref;
+    int ref;
+    friend Loader;
 
 public:
-	// Konstruktor
-	KarteDaten( Schrift *zSchrift, int id );
-	// Destruktor
-	~KarteDaten();
-	// nicht constant
-	virtual void thread();
-	void updateErlaubt();
+    // Konstruktor
+    KarteDaten( Schrift *zSchrift, int id );
+    // Destruktor
+    ~KarteDaten();
+    // nicht constant
+    void updateErlaubt();
     void ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal );
-	void setSichtbar( bool sichtbar );
-	void setSichtbar();
-	void setAuswahl( bool auswahl );
-	void setPosition( int lPos );
-	bool tick( double tickVal );
-	void doMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	int getKarteId() const;
-	bool istausgewählt() const;
-	// Reference Counting
-	KarteDaten *getThis();
-	KarteDaten *release();
+    void setSichtbar( bool sichtbar );
+    void setSichtbar();
+    void setAuswahl( bool auswahl );
+    void setPosition( int lPos );
+    bool tick( double tickVal );
+    void doMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    int getKarteId() const;
+    bool istausgewählt() const;
+    // Reference Counting
+    KarteDaten *getThis();
+    KarteDaten *release();
 };
 
 class KarteAuswahlFenster : private Thread
 {
 private:
-	int anzahl;
-	int auswahl;
-	RCArray< KarteDaten > *members;
-	LRahmen *rahmen;
-	Schrift *schrift;
-	double tickVal;
-	int animation;
-	Punkt pos;
-	Punkt gr;
-	int spielId;
-	int seite;
-	bool rend;
+    int anzahl;
+    int auswahl;
+    RCArray< KarteDaten > *members;
+    LRahmen *rahmen;
+    Schrift *schrift;
+    double tickVal;
+    int animation;
+    Punkt pos;
+    Punkt gr;
+    int spielId;
+    int seite;
+    bool rend;
     unsigned char alpha;
-	int ref;
+    int ref;
 
 public:
-	// Konstruktor
-	KarteAuswahlFenster( Schrift *zSchrift );
-	// Destruktor
-	~KarteAuswahlFenster();
-	// nicht constant
-	void setSpielId( int spielId );
-	void setSichtbar( bool sichtbar );
-	void blättern( bool oben );
-	void updateListe();
-	virtual void thread();
-	bool tick( double tickVal );
-	void doMausEreignis( MausEreignis &me );
-	void render( Bild &zrObj );
-	// constant
-	int getAnzahl() const;
-	int getSeiteAnzahl() const;
-	int getSeite() const;
-	int getAnzahlAufSeite() const;
-	bool hatAuswahl() const;
-	KarteDaten *getAuswahl() const;
-	// Reference Counting
-	KarteAuswahlFenster *getThis();
-	KarteAuswahlFenster *release();
+    // Konstruktor
+    KarteAuswahlFenster( Schrift *zSchrift );
+    // Destruktor
+    ~KarteAuswahlFenster();
+    // nicht constant
+    void setSpielId( int spielId );
+    void setSichtbar( bool sichtbar );
+    void blättern( bool oben );
+    void updateListe();
+    virtual void thread();
+    bool tick( double tickVal );
+    void doMausEreignis( MausEreignis &me );
+    void render( Bild &zrObj );
+    // constant
+    int getAnzahl() const;
+    int getSeiteAnzahl() const;
+    int getSeite() const;
+    int getAnzahlAufSeite() const;
+    bool hatAuswahl() const;
+    KarteDaten *getAuswahl() const;
+    // Reference Counting
+    KarteAuswahlFenster *getThis();
+    KarteAuswahlFenster *release();
 };
 
 #endif

+ 251 - 241
KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.cpp

@@ -18,198 +18,64 @@ void SpielAuswahlKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVa
     ( (SpielDaten*)p )->ksgsAktion( parameter, retVal );
 }
 
-// Inhalt der SpielDaten Klasse aus SpielAuswahl.h
-// Konstruktor
-SpielDaten::SpielDaten( Schrift *zSchrift, const char *name, int id )
-    : Thread()
+SpielDaten::Loader::Loader( SpielDaten *sd, int aktion )
 {
+    this->sd = sd;
+    this->aktion = aktion;
     beenden = 0;
-    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;
-    aktion = 1;
-    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;
+    ref = 2;
     start();
 }
 
-// Destruktor
-SpielDaten::~SpielDaten()
+void SpielDaten::Loader::setBeenden()
 {
     beenden = 1;
-    if( run )
-        this->warteAufThread( 5000 );
-    if( run )
-        ende();
-    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( run && aktion == (sichtbar ? 2 : 0) )
-    {
-        hauptScreen->unlock();
-        rend = 1;
-        return;
-    }
-    beenden = 1;
-    if( run )
-        this->warteAufThread( 1000 );
-    if( run )
-        ende();
-    beenden = 0;
-    aktion = sichtbar ? 2 : 0;
-    start();
-    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 && !( aktion == 2 && run ) )
-    {
-        beenden = 1;
-        if( run )
-            this->warteAufThread( 1000 );
-        if( run )
-            ende();
-        beenden = 0;
-        aktion = 2;
-        start();
-    }
-    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::thread()
+void SpielDaten::Loader::thread()
 {
     Text *pfad = new Text( "data/spiele/" );
-    pfad->append( name->getText() );
+    pfad->append( sd->name->getText() );
     pfad->append( "/data/game.ini" );
     if( !DateiExistiert( pfad->getThis() ) )
     {
         if( !aktion )
         {
-            if( aAnimation )
-                aAnimation->setSichtbar( 0 );
-            geladen = 0;
-            ausgewählt = 0;
+            if( sd->aAnimation )
+                sd->aAnimation->setSichtbar( 0 );
+            sd->geladen = 0;
+            sd->ausgewählt = 0;
             hauptScreen->lock();
-            if( aAnimation )
-                aAnimation = aAnimation->release();
+            if( sd->aAnimation )
+                sd->aAnimation = sd->aAnimation->release();
             hauptScreen->unlock();
-            if( hintergrund )
-                hintergrund = hintergrund->release();
-            if( beschreibung )
+            if( sd->hintergrund )
+                sd->hintergrund = sd->hintergrund->release();
+            if( sd->beschreibung )
             {
-                beschreibung->zurücksetzen();
-                beschreibung = beschreibung->release();
+                sd->beschreibung->zurücksetzen();
+                sd->beschreibung = sd->beschreibung->release();
             }
-            if( ksgs )
+            if( sd->ksgs )
             {
                 dllDateien->releaseDLL( "KSGScript.dll" );
-                ksgs = 0;
+                sd->ksgs = 0;
             }
         }
         else
         {
-            if( !hintergrund )
-                hintergrund = new Bild();
-            hintergrund->neuBild( 200, 100, 0xFF000000 );
-            schrift->lock();
-            schrift->setSchriftSize( 12 );
-            schrift->setDrawPosition( 10, 10 );
-            schrift->renderText( name, *hintergrund, 0xFFFFFFFF );
-            schrift->unlock();
-            if( !geladen )
-                geladen = 1;
-            rend = 1;
-            int dgId = infoKlient->getDateiGruppeIdVonSpiel( spielId );
+            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" );
@@ -256,25 +122,25 @@ void SpielDaten::thread()
             }
             if( aktion == 2 && !beenden )
             {
-                if( beschreibung )
+                if( sd->beschreibung )
                 {
-                    beschreibung->zurücksetzen();
-                    beschreibung = beschreibung->release();
+                    sd->beschreibung->zurücksetzen();
+                    sd->beschreibung = sd->beschreibung->release();
                 }
-                if( !ksgs )
-                    ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
-                if( ksgs )
+                if( !sd->ksgs )
+                    sd->ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
+                if( sd->ksgs )
                 {
-                    KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( ksgs, KSGS_START_FUNKTION );
+                    KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( sd->ksgs, KSGS_START_FUNKTION );
                     if( getKSGScript )
                     {
-                        beschreibung = getKSGScript();
-                        beschreibung->setBildschirmZ( hauptScreen->getThis() );
-                        beschreibung->setSchriftZ( schrift->getThis() );
-                        beschreibung->setSize( 578, 428 );
-                        beschreibung->setRückrufParam( this );
-                        beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
-                        beschreibung->setScriptDatei( "data/script/SpielNichtAktuell.ksgs" );
+                        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
                     {
@@ -290,15 +156,14 @@ void SpielDaten::thread()
                                                                   new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
                                                                   new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
                 }
-                if( beschreibung )
-                    geladen = 2;
-                if( beschreibung && ksgs && ausgewählt )
-                    beschreibung->neuLaden();
+                if( sd->beschreibung )
+                    sd->geladen = 2;
+                if( sd->beschreibung && sd->ksgs && sd->ausgewählt )
+                    sd->beschreibung->neuLaden();
             }
         }
         pfad->release();
-        rend = 1;
-        run = 0;
+        sd->rend = 1;
         return;
     }
     Datei *ini = new Datei();
@@ -306,54 +171,54 @@ void SpielDaten::thread()
     ini->open( Datei::Style::lesen );
     if( !aktion )
     {
-        if( aAnimation )
-            aAnimation->setSichtbar( 0 );
-        geladen = 0;
-        ausgewählt = 0;
+        if( sd->aAnimation )
+            sd->aAnimation->setSichtbar( 0 );
+        sd->geladen = 0;
+        sd->ausgewählt = 0;
         hauptScreen->lock();
-        if( aAnimation )
-            aAnimation = aAnimation->release();
+        if( sd->aAnimation )
+            sd->aAnimation = sd->aAnimation->release();
         hauptScreen->unlock();
-        if( hintergrund )
-            hintergrund = hintergrund->release();
-        if( beschreibung )
+        if( sd->hintergrund )
+            sd->hintergrund = sd->hintergrund->release();
+        if( sd->beschreibung )
         {
-            beschreibung->zurücksetzen();
-            beschreibung = beschreibung->release();
+            sd->beschreibung->zurücksetzen();
+            sd->beschreibung = sd->beschreibung->release();
         }
-        if( ksgs )
+        if( sd->ksgs )
         {
             dllDateien->releaseDLL( "KSGScript.dll" );
-            ksgs = 0;
+            sd->ksgs = 0;
         }
-        rend = 1;
+        sd->rend = 1;
     }
     else
     {
         Text *pf = ini->leseZeile();
         pf->remove( pf->getLength() - 1 );
         pf->insert( 0, "/bilder/" );
-        pf->insert( 0, name->getText() );
+        pf->insert( 0, sd->name->getText() );
         pf->insert( 0, "data/spiele/" );
         if( pf->hat( ".ltdb/" ) )
         {
-            if( !hintergrund )
+            if( !sd->hintergrund )
             {
                 LTDBDatei *bildDatei = new LTDBDatei();
                 bildDatei->setDatei( pf->getTeilText( 0, pf->positionVon( ".ltdb" ) + 5 ) );
                 bildDatei->leseDaten( 0 );
-                hintergrund = bildDatei->laden( 0, pf->getTeilText( pf->positionVon( ".ltdb" ) + 6 ) );
+                sd->hintergrund = bildDatei->laden( 0, pf->getTeilText( pf->positionVon( ".ltdb" ) + 6 ) );
                 bildDatei->release();
             }
         }
         else
         {
-            if( !hintergrund )
+            if( !sd->hintergrund )
             {
                 LTDBDatei *bildDatei = new LTDBDatei();
                 bildDatei->setDatei( pf->getThis() );
                 bildDatei->leseDaten( 0 );
-                hintergrund = bildDatei->laden( 0, bildDatei->zBildListe()->get( 0 ) );
+                sd->hintergrund = bildDatei->laden( 0, bildDatei->zBildListe()->get( 0 ) );
                 bildDatei->release();
             }
         }
@@ -363,31 +228,31 @@ void SpielDaten::thread()
         pf = ini->leseZeile();
         pf->remove( pf->getLength() - 1 );
         pf->insert( 0, "/data/" );
-        pf->insert( 0, name->getText() );
+        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*)&spielId, 4 );
+        idDatei->lese( (char*)&sd->spielId, 4 );
         idDatei->close();
         idDatei->release();
         pf->release();
-        if( !geladen )
-            geladen = 1;
-        rend = 1;
+        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, name->getText() );
+            pf->insert( 0, sd->name->getText() );
             pf->insert( 0, "data/spiele/" );
             if( !pf->hat( ".ltdb/" ) )
             {
                 hauptScreen->lock();
-                if( aAnimation )
-                    aAnimation = aAnimation->release();
+                if( sd->aAnimation )
+                    sd->aAnimation = sd->aAnimation->release();
                 hauptScreen->unlock();
                 LTDBDatei *add = new LTDBDatei();
                 add->setDatei( pf->getThis() );
@@ -396,36 +261,36 @@ void SpielDaten::thread()
                 ad->ladeAnimation( add );
                 ad->setWiederhohlend( 1 );
                 ad->setFPS( 30 );
-                aAnimation = new Animation2D();
-                aAnimation->setSize( 200, 100 );
-                aAnimation->setPosition( 0, 0 );
-                aAnimation->setAnimationDataZ( ad );
+                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, name->getText() );
+            pf->insert( 0, sd->name->getText() );
             pf->insert( 0, "data/spiele/" );
-            if( beschreibung )
+            if( sd->beschreibung )
             {
-                beschreibung->zurücksetzen();
-                beschreibung = beschreibung->release();
+                sd->beschreibung->zurücksetzen();
+                sd->beschreibung = sd->beschreibung->release();
             }
-            if( !ksgs )
-                ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
-            if( ksgs )
+            if( !sd->ksgs )
+                sd->ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
+            if( sd->ksgs )
             {
-                KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( ksgs, KSGS_START_FUNKTION );
+                KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( sd->ksgs, KSGS_START_FUNKTION );
                 if( getKSGScript )
                 {
-                    beschreibung = getKSGScript();
-                    beschreibung->setBildschirmZ( hauptScreen->getThis() );
-                    beschreibung->setSchriftZ( schrift->getThis() );
-                    beschreibung->setSize( 578, 428 );
-                    beschreibung->setRückrufParam( this );
-                    beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
-                    beschreibung->setScriptDatei( pf->getText() );
+                    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
                 {
@@ -442,20 +307,165 @@ void SpielDaten::thread()
                                                               new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
             }
             pf->release();
-            if( beschreibung )
-                geladen = 2;
-            if( beschreibung && ksgs && ausgewählt )
-                beschreibung->neuLaden();
-            rend = 1;
+            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( !erlaubt )
-        updateErlaubt();
-    aktion = 0;
-    run = 0;
+    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;
 }
 

+ 90 - 78
KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.h

@@ -13,101 +13,113 @@ using namespace KSGScript;
 
 class SpielDaten; // aus dieser Datei
 
-class SpielDaten : public Thread
+class SpielDaten
 {
 private:
-	int spielId;
-	Text *name;
-	Bild *hintergrund;
-	Animation2D *aAnimation;
-	Schrift *schrift;
+    class Loader : public Thread
+    {
+    private:
+        SpielDaten * sd;
+        bool beenden;
+        int aktion;
+        int ref;
+    public:
+        Loader( SpielDaten *sd, int aktion );
+        void setBeenden();
+        void thread() override;
+        Loader *release();
+        int getAktion() const;
+    };
+    Loader *loader;
+    int spielId;
+    Text *name;
+    Bild *hintergrund;
+    Animation2D *aAnimation;
+    Schrift *schrift;
     KSGScriptObj *beschreibung;
     HINSTANCE ksgs;
-	LRahmen *rahmen;
-	double tickVal;
-	int animation;
-	bool ausgewählt;
-	Punkt pos;
-	Punkt gr;
-	int geladen;
-	int aktion;
-	AlphaFeld *auswahl;
-	int ladenBild;
-	bool beenden;
-	bool rend;
-	bool erlaubt;
+    LRahmen *rahmen;
+    double tickVal;
+    int animation;
+    bool ausgewählt;
+    Punkt pos;
+    Punkt gr;
+    int geladen;
+    AlphaFeld *auswahl;
+    int ladenBild;
+    bool rend;
+    bool erlaubt;
     unsigned char tAlpha;
     unsigned char alpha;
-	int ref;
+    int ref;
 
 public:
-	// Konstruktor
-	SpielDaten( Schrift *zSchrift, const char *name, int id );
-	// Destruktor
-	~SpielDaten();
-	// nicht constant
-	virtual void thread();
+    // Konstruktor
+    SpielDaten( Schrift *zSchrift, const char *name, int id );
+    // Destruktor
+    ~SpielDaten();
+    // nicht constant
     void ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal );
-	void updateErlaubt();
-	void setSichtbar( bool sichtbar );
-	void setSichtbar();
-	void setAuswahl( bool auswahl );
-	void setPosition( int lPos );
-	bool tick( double tickVal );
-	void doMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	int getSpielId() const;
-	bool istausgewählt() const;
-	Text *zName() const;
-	bool istErlaubt() const;
-	// Reference Counting
-	SpielDaten *getThis();
-	SpielDaten *release();
+    void updateErlaubt();
+    void setSichtbar( bool sichtbar );
+    void setSichtbar();
+    void setAuswahl( bool auswahl );
+    void setPosition( int lPos );
+    bool tick( double tickVal );
+    void doMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    int getSpielId() const;
+    bool istausgewählt() const;
+    Text *zName() const;
+    bool istErlaubt() const;
+    // Reference Counting
+    SpielDaten *getThis();
+    SpielDaten *release();
 };
 
 class SpielAuswahlFenster : private Thread
 {
 private:
-	int anzahl;
-	int auswahl;
-	RCArray< SpielDaten > *members;
-	LRahmen *rahmen;
-	Schrift *schrift;
-	double tickVal;
-	int animation;
-	Punkt pos;
-	Punkt gr;
-	int seite;
-	bool rend;
+    int anzahl;
+    int auswahl;
+    RCArray< SpielDaten > *members;
+    LRahmen *rahmen;
+    Schrift *schrift;
+    double tickVal;
+    int animation;
+    Punkt pos;
+    Punkt gr;
+    int seite;
+    bool rend;
     unsigned char alpha;
-	int ref;
+    int ref;
 
 public:
-	// Konstruktor
-	SpielAuswahlFenster( Schrift *zSchrift );
-	// Destruktor
-	~SpielAuswahlFenster();
-	// nicht constant
-	void setSichtbar( bool sichtbar );
-	void blättern( bool oben );
-	void updateListe();
-	virtual void thread();
-	bool tick( double tickVal );
-	void doMausEreignis( MausEreignis &me );
-	void render( Bild &zrObj );
-	// constant
-	int getAnzahl() const;
-	int getSeiteAnzahl() const;
-	int getSeite() const;
-	int getAnzahlAufSeite() const;
-	bool hatAuswahl() const;
-	SpielDaten *getAuswahl() const;
-	SpielDaten *zAuswahl() const;
-	bool istAuswahlErlubt() const;
-	// Reference Counting
-	SpielAuswahlFenster *getThis();
-	SpielAuswahlFenster *release();
+    // Konstruktor
+    SpielAuswahlFenster( Schrift *zSchrift );
+    // Destruktor
+    ~SpielAuswahlFenster();
+    // nicht constant
+    void setSichtbar( bool sichtbar );
+    void blättern( bool oben );
+    void updateListe();
+    virtual void thread();
+    bool tick( double tickVal );
+    void doMausEreignis( MausEreignis &me );
+    void render( Bild &zrObj );
+    // constant
+    int getAnzahl() const;
+    int getSeiteAnzahl() const;
+    int getSeite() const;
+    int getAnzahlAufSeite() const;
+    bool hatAuswahl() const;
+    SpielDaten *getAuswahl() const;
+    SpielDaten *zAuswahl() const;
+    bool istAuswahlErlubt() const;
+    // Reference Counting
+    SpielAuswahlFenster *getThis();
+    SpielAuswahlFenster *release();
 };
 
 #endif

BIN
Klient - Verknüpfung.lnk