Browse Source

framework changes

Kolja Strohm 2 years ago
parent
commit
ddab274315
6 changed files with 1146 additions and 1146 deletions
  1. 158 158
      patcher/News.cpp
  2. 14 14
      patcher/News.h
  3. 140 140
      patcher/Patcher.cpp
  4. 19 19
      patcher/Patcher.h
  5. 4 4
      patcher/patcher.vcxproj
  6. 811 811
      patcher/start.cpp

+ 158 - 158
patcher/News.cpp

@@ -7,181 +7,181 @@
 #include <Datei.h>
 #include <InitDatei.h>
 
-void KSGSRückruf( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
+void KSGSRückruf(void* p, RCArray< KSGSVariable >* parameter, KSGSVariable** ret)
 {
-    if( !p )
-        return;
-    ( (News *)p )->rückruf( parameter, ret );
+	if (!p)
+		return;
+	((News*)p)->rückruf(parameter, ret);
 }
 
 // Inhalt der News Klasse aus News.h
 // Konstruktor
-News::News( UIInit &uiFactory, KSGClient::NewsServerClient *client )
-    : Thread()
+News::News(UIInit& uiFactory, KSGClient::NewsServerClient* client)
+	: Thread()
 {
-    this->client = client;
-    // Ladeanimation laden
-    Animation2DData *aData = new Animation2DData();
-    LTDBDatei *aDatei = new LTDBDatei();
-    aDatei->setDatei( new Text( "data/bilder/ladeanimation.ltdb" ) );
-    aDatei->leseDaten( 0 );
-    aData->ladeAnimation( aDatei );
-    aData->setFPS( 30 );
-    aData->setWiederhohlend( 1 );
-    aData->setTransparent( 0 );
-    laden = new Animation2D();
-    laden->setPosition( uiFactory.initParam.bildschirm->getBackBufferSize() / 2 - Punkt( 25, 25 ) );
-    laden->setSize( 50, 50 );
-    laden->setAPS( 450 );
-    laden->setAnimationDataZ( aData );
-    laden->setRahmen( 1 );
-    laden->setRahmenBreite( 1 );
-    laden->setRahmenFarbe( 0xFFFFFFFF );
-    laden->setSichtbar( 0 );
-    uiFactory.initParam.bildschirm->setOnTopZeichnung( dynamic_cast<Zeichnung *>( laden->getThis() ) );
-    // Fehler Textfeld Initialisieren
-    fehler = uiFactory.createTextFeld( uiFactory.initParam );
-    fehler->setStyle( TextFeld::Style::Text & ~TextFeld::Style::Sichtbar );
-    fehler->setPosition( 10, 60 );
-    fehler->setSize( 480, 312 );
-    fehler->setText( "Fehler beim Laden der Seite!\n" );
-    uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( fehler->getThis() ) );
-    // Startwerte Initialisieren
-    this->uiFactory = uiFactory;
-    // DLL Datei Laden
-    ksgsDll = LoadLibrary( "data/bin/KSGScript.dll" );
-    if( !ksgsDll )
-    { // Error
-        fehler->addZeile( "Die DLL Datei 'data/bin/KSGScript.dll' wurde nicht gefunden." );
-        fehler->addStyle( TextFeld::Style::Sichtbar );
-        laden->setSichtbar( 0 );
-        uiFactory.initParam.bildschirm->setOnTop( 0 );
-        run = 0;
-        return;
-    }
-    KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress( ksgsDll, KSGS_START_FUNKTION );
-    if( !getKSGSZeichnung )
-    { // Error
-        fehler->addZeile( "Die Funktion '" KSGS_START_FUNKTION "' wurde in der\nDLL Datei 'data/bil/KSGScript.dll' nicht gefunden." );
-        fehler->addStyle( TextFeld::Style::Sichtbar );
-        laden->setSichtbar( 0 );
-        run = 0;
-        return;
-    }
-    frame = getKSGSZeichnung();
-    if( !frame )
-    { // Error
-        fehler->addZeile( "Unbekannter Fehler." );
-        fehler->addStyle( TextFeld::Style::Sichtbar );
-        laden->setSichtbar( 0 );
-        run = 0;
-        return;
-    }
-    frame->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
-    frame->setBildschirmZ( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
-    frame->setPosition( 10, 60 );
-    frame->setSize( 480, 312 );
-    frame->setCallbackParam( this );
-    frame->setCallbackFunktion( KSGSRückruf );
-    uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( frame->getThis() ) );
-    scriptName = new Text( "Patcher/Start" );
-    // Lade Thread starten
-    start();
+	this->client = client;
+	// Ladeanimation laden
+	Animation2DData* aData = new Animation2DData();
+	LTDBDatei* aDatei = new LTDBDatei();
+	aDatei->setDatei(new Text("data/bilder/ladeanimation.ltdb"));
+	aDatei->leseDaten(0);
+	aData->ladeAnimation(aDatei);
+	aData->setFPS(30);
+	aData->setWiederhohlend(1);
+	aData->setTransparent(0);
+	laden = new Animation2D();
+	laden->setPosition(uiFactory.initParam.bildschirm->getBackBufferSize() / 2 - Punkt(25, 25));
+	laden->setSize(50, 50);
+	laden->setAPS(450);
+	laden->setAnimationDataZ(aData);
+	laden->setRahmen(1);
+	laden->setRahmenBreite(1);
+	laden->setRahmenFarbe(0xFFFFFFFF);
+	laden->setSichtbar(0);
+	uiFactory.initParam.bildschirm->setOnTopZeichnung(dynamic_cast<Zeichnung*>(laden->getThis()));
+	// Fehler Textfeld Initialisieren
+	fehler = uiFactory.createTextFeld(uiFactory.initParam);
+	fehler->setStyle(TextFeld::Style::Text & ~TextFeld::Style::Sichtbar);
+	fehler->setPosition(10, 60);
+	fehler->setSize(480, 312);
+	fehler->setText("Fehler beim Laden der Seite!\n");
+	uiFactory.initParam.bildschirm->addMember(dynamic_cast<Zeichnung*>(fehler->getThis()));
+	// Startwerte Initialisieren
+	this->uiFactory = uiFactory;
+	// DLL Datei Laden
+	ksgsDll = LoadLibrary("data/bin/KSGScript.dll");
+	if (!ksgsDll)
+	{ // Error
+		fehler->addZeile("Die DLL Datei 'data/bin/KSGScript.dll' wurde nicht gefunden.");
+		fehler->addStyle(TextFeld::Style::Sichtbar);
+		laden->setSichtbar(0);
+		uiFactory.initParam.bildschirm->setOnTop(0);
+		run = 0;
+		return;
+	}
+	KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress(ksgsDll, KSGS_START_FUNKTION);
+	if (!getKSGSZeichnung)
+	{ // Error
+		fehler->addZeile("Die Funktion '" KSGS_START_FUNKTION "' wurde in der\nDLL Datei 'data/bil/KSGScript.dll' nicht gefunden.");
+		fehler->addStyle(TextFeld::Style::Sichtbar);
+		laden->setSichtbar(0);
+		run = 0;
+		return;
+	}
+	frame = getKSGSZeichnung();
+	if (!frame)
+	{ // Error
+		fehler->addZeile("Unbekannter Fehler.");
+		fehler->addStyle(TextFeld::Style::Sichtbar);
+		laden->setSichtbar(0);
+		run = 0;
+		return;
+	}
+	frame->setSchriftZ(dynamic_cast<Schrift*>(uiFactory.initParam.schrift->getThis()));
+	frame->setBildschirmZ(dynamic_cast<Bildschirm*>(uiFactory.initParam.bildschirm->getThis()));
+	frame->setPosition(10, 60);
+	frame->setSize(480, 312);
+	frame->setCallbackParam(this);
+	frame->setCallbackFunktion(KSGSRückruf);
+	uiFactory.initParam.bildschirm->addMember(dynamic_cast<Zeichnung*>(frame->getThis()));
+	scriptName = new Text("Patcher/Start");
+	// Lade Thread starten
+	start();
 }
 
 // Destruktor
 News::~News()
 {
-    if( client )
-    {
-        client->trenne( 1 );
-        client->release();
-    }
-    if( frame )
-    {
-        frame->reset();
-        frame->setBildschirmZ( 0 );
-        uiFactory.initParam.bildschirm->removeMember( frame );
-        frame->release();
-    }
-    if( ksgsDll )
-        FreeLibrary( ksgsDll );
-    if( scriptName )
-        scriptName->release();
-    laden->release();
-    fehler->release();
+	if (client)
+	{
+		client->trenne(1);
+		client->release();
+	}
+	if (frame)
+	{
+		frame->reset();
+		frame->setBildschirmZ(0);
+		uiFactory.initParam.bildschirm->removeMember(frame);
+		frame->release();
+	}
+	if (ksgsDll)
+		FreeLibrary(ksgsDll);
+	if (scriptName)
+		scriptName->release();
+	laden->release();
+	fehler->release();
 }
 
 // nicht constant
-void News::rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
+void News::rückruf(RCArray< KSGSVariable >* parameter, KSGSVariable** ret)
 {
-    if( isRunning() )
-        return;
-    KSGSVariable *bef = parameter->z( 0 );
-    if( !bef )
-        return;
-    Text *sn = bef->getText();
-    if( !sn || !sn->getLength() )
-    {
-        if( sn )
-            sn->release();
-        return;
-    }
-    scriptName->setText( sn->getText() );
-    sn->release();
-    start();
+	if (isRunning())
+		return;
+	KSGSVariable* bef = parameter->z(0);
+	if (!bef)
+		return;
+	Text* sn = bef->getText();
+	if (!sn || !sn->getLength())
+	{
+		if (sn)
+			sn->release();
+		return;
+	}
+	scriptName->setText(sn->getText());
+	sn->release();
+	start();
 }
 
 void News::thread()
 {
-    uiFactory.initParam.bildschirm->setOnTop( 1 );
-    laden->setSichtbar( 1 );
-    frame->reset();
-    // KSGScript Seite Herunterladen
-    if( client )
-    {
-        if( !client->verbinde() )
-        {
-            fehler->addZeile( "Fehler beim verbinden mit dem News-Server." );
-            fehler->addStyle( TextFeld::Style::Sichtbar );
-            laden->setSichtbar( 0 );
-            uiFactory.initParam.bildschirm->setOnTop( 0 );
-            return;
-        }
-        if( !client->ladeSeite( scriptName->getText() ) )
-        {
-            client->trenne( 0 );
-            fehler->addZeile( "Die Seite konnte nicht herruntergeladen werden." );
-            fehler->addStyle( TextFeld::Style::Sichtbar );
-            laden->setSichtbar( 0 );
-            uiFactory.initParam.bildschirm->setOnTop( 0 );
-            return;
-        }
-        client->trenne( 0 );
-    }
-    else
-    {
-        fehler->addZeile( "Es steht kein News Client zur Verfügung." );
-        fehler->addStyle( TextFeld::Style::Sichtbar );
-        laden->setSichtbar( 0 );
-        uiFactory.initParam.bildschirm->setOnTop( 0 );
-        return;
-    }
-    // KSGScript Laden
-    Text *pfad = new Text( "data/tmp/news/" );
-    pfad->append( scriptName->getText() );
-    pfad->append( "/seite.ksgs" );
-    frame->setScriptDatei( pfad );
-    if( !frame->neuLaden() )
-    { // error
-        fehler->addZeile( "Es befindet sich ein Scriptfehler auf dieser Seite." );
-        fehler->addStyle( TextFeld::Style::Sichtbar );
-        laden->setSichtbar( 0 );
-        uiFactory.initParam.bildschirm->setOnTop( 0 );
-        run = 0;
-        return;
-    }
-    laden->setSichtbar( 0 );
-    uiFactory.initParam.bildschirm->setOnTop( 0 );
-    run = 0;
+	uiFactory.initParam.bildschirm->setOnTop(1);
+	laden->setSichtbar(1);
+	frame->reset();
+	// KSGScript Seite Herunterladen
+	if (client)
+	{
+		if (!client->verbinde())
+		{
+			fehler->addZeile("Fehler beim verbinden mit dem News-Server.");
+			fehler->addStyle(TextFeld::Style::Sichtbar);
+			laden->setSichtbar(0);
+			uiFactory.initParam.bildschirm->setOnTop(0);
+			return;
+		}
+		if (!client->ladeSeite(scriptName->getText()))
+		{
+			client->trenne(0);
+			fehler->addZeile("Die Seite konnte nicht herruntergeladen werden.");
+			fehler->addStyle(TextFeld::Style::Sichtbar);
+			laden->setSichtbar(0);
+			uiFactory.initParam.bildschirm->setOnTop(0);
+			return;
+		}
+		client->trenne(0);
+	}
+	else
+	{
+		fehler->addZeile("Es steht kein News Client zur Verfügung.");
+		fehler->addStyle(TextFeld::Style::Sichtbar);
+		laden->setSichtbar(0);
+		uiFactory.initParam.bildschirm->setOnTop(0);
+		return;
+	}
+	// KSGScript Laden
+	Text* pfad = new Text("data/tmp/news/");
+	pfad->append(scriptName->getText());
+	pfad->append("/seite.ksgs");
+	frame->setScriptDatei(pfad);
+	if (!frame->neuLaden())
+	{ // error
+		fehler->addZeile("Es befindet sich ein Scriptfehler auf dieser Seite.");
+		fehler->addStyle(TextFeld::Style::Sichtbar);
+		laden->setSichtbar(0);
+		uiFactory.initParam.bildschirm->setOnTop(0);
+		run = 0;
+		return;
+	}
+	laden->setSichtbar(0);
+	uiFactory.initParam.bildschirm->setOnTop(0);
+	run = 0;
 }

+ 14 - 14
patcher/News.h

@@ -15,22 +15,22 @@ using namespace Network;
 class News : public Thread
 {
 private:
-    KSGScriptObj *frame;
-    HMODULE ksgsDll;
-    Text *scriptName;
-    Animation2D *laden;
-    TextFeld *fehler;
-    UIInit uiFactory;
-    KSGClient::NewsServerClient *client;
+	KSGScriptObj* frame;
+	HMODULE ksgsDll;
+	Text* scriptName;
+	Animation2D* laden;
+	TextFeld* fehler;
+	UIInit uiFactory;
+	KSGClient::NewsServerClient* client;
 
 public:
-    // Konstruktor
-    News( UIInit &uiFactory, KSGClient::NewsServerClient *client );
-    // Destruktor
-    ~News();
-    // nicht constant
-    void rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret );
-    void thread();
+	// Konstruktor
+	News(UIInit& uiFactory, KSGClient::NewsServerClient* client);
+	// Destruktor
+	~News();
+	// nicht constant
+	void rückruf(RCArray< KSGSVariable >* parameter, KSGSVariable** ret);
+	void thread();
 };
 
 #endif

+ 140 - 140
patcher/Patcher.cpp

@@ -5,179 +5,179 @@
 #include <Text.h>
 #include <GSLDateiV.h>
 
-extern InitDatei *userOptions;
+extern InitDatei* userOptions;
 
-typedef UpdaterV *( *GetUpdater )( KSGClient::PatchServerClient * );
-typedef GSL::GSLDateiV *( *GetGSLDatei )( );
+typedef UpdaterV* (*GetUpdater)(KSGClient::PatchServerClient*);
+typedef GSL::GSLDateiV* (*GetGSLDatei)();
 
 // Inhalt der Patcher Klasse aus Patcher.h
 // Konstruktor
-Patcher::Patcher( FBalken *fortschritt, TextFeld *status, Knopf *play, bool *close, KSGClient::PatchServerClient *client )
-    : Thread()
+Patcher::Patcher(FBalken* fortschritt, TextFeld* status, Knopf* play, bool* close, KSGClient::PatchServerClient* client)
+	: Thread()
 {
-    if( !client )
-    {
-        updater = 0;
-        MessageBox( 0, "Es steht kein Patch Client zur Verfügung.", "Fehler", MB_ICONERROR );
-    }
-    else
-    {
-        // Dll Laden
-        updateDll = LoadLibrary( "data/bin/update.dll" );
-        if( !updateDll )
-        {
-            updater = 0;
-            MessageBox( 0, "Die DLL Datei 'data/bin/update.dll' wurde nicht gefunden.", "Fehler", MB_ICONERROR );
-        }
-        else
-        {
-            GetUpdater getUpdater = (GetUpdater)GetProcAddress( updateDll, "getUpdater" );
-            if( !getUpdater )
-            {
-                updater = 0;
-                MessageBox( 0, "Der Einstiegspunkt 'getUpdater' konnte in der DLL Datei 'data/bin/update.dll' nicht gefunden.", "Fehler", MB_ICONERROR );
-            }
-            else
-                updater = getUpdater( client );
-        }
-        if( !updater )
-            client->release();
-    }
-    // Initialisierung
-    this->fortschritt = fortschritt;
-    this->status = status;
-    this->play = play;
-    this->close = close;
-    ret = 0;
+	if (!client)
+	{
+		updater = 0;
+		MessageBox(0, "Es steht kein Patch Client zur Verfügung.", "Fehler", MB_ICONERROR);
+	}
+	else
+	{
+		// Dll Laden
+		updateDll = LoadLibrary("data/bin/update.dll");
+		if (!updateDll)
+		{
+			updater = 0;
+			MessageBox(0, "Die DLL Datei 'data/bin/update.dll' wurde nicht gefunden.", "Fehler", MB_ICONERROR);
+		}
+		else
+		{
+			GetUpdater getUpdater = (GetUpdater)GetProcAddress(updateDll, "getUpdater");
+			if (!getUpdater)
+			{
+				updater = 0;
+				MessageBox(0, "Der Einstiegspunkt 'getUpdater' konnte in der DLL Datei 'data/bin/update.dll' nicht gefunden.", "Fehler", MB_ICONERROR);
+			}
+			else
+				updater = getUpdater(client);
+		}
+		if (!updater)
+			client->release();
+	}
+	// Initialisierung
+	this->fortschritt = fortschritt;
+	this->status = status;
+	this->play = play;
+	this->close = close;
+	ret = 0;
 }
 
 // Destruktor
 Patcher::~Patcher()
 {
-    fortschritt->release();
-    status->release();
-    play->release();
-    if( updater )
-        updater->release();
-    FreeLibrary( updateDll );
+	fortschritt->release();
+	status->release();
+	play->release();
+	if (updater)
+		updater->release();
+	FreeLibrary(updateDll);
 }
 
 // nicht constant
 void Patcher::startPatch()
 {
-    start();
+	start();
 }
 
 void Patcher::thread()
 {
-    if( !updater )
-    {
-        status->lockZeichnung();
-        status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
-        status->unlockZeichnung();
-        run = 0;
-        return;
-    }
-    status->lockZeichnung();
-    status->setText( "Suche nach Updates . . ." );
-    status->unlockZeichnung();
-    Text dgPfad;
-    int gruppe = updater->getNextDateiGruppe( &dgPfad ); // Nächste Dateigruppe die geupdatet werden muss
-    while( gruppe )
-    {
-        if( gruppe == -1 )
-        { // error
-            status->lockZeichnung();
-            status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
-            status->unlockZeichnung();
-            MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
-            run = 0;
-            return;
-        }
-        bool clientGruppe = !dgPfad.getLength();
-        if( !clientGruppe )
-        { // Das Spiel kann bereits gestartet werden
-            play->addStyle( Knopf::Style::Sichtbar );
-            ret = 2;
-        }
-        status->lockZeichnung();
-        status->setText( "Update für '" );
-        if( !clientGruppe )
-            status->zText()->append( dgPfad.getText() );
-        else
-            status->zText()->append( "Client" );
-        status->zText()->append( "'. . ." );
-        status->unlockZeichnung();
-        UpdateParams params;
-        params.abbruch = close;
-        params.dateiGruppe = gruppe;
-        params.zFortschritt = fortschritt;
-        params.zStatus = 0;
-        int res = updater->update( &params );
-        if( res == 3 )
-        { // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
-            status->lockZeichnung();
-            status->setText( "Klicke auf Play, um die verbleibenen Änderungen zu übernehmen." );
-            status->unlockZeichnung();
-            play->addStyle( Knopf::Style::Sichtbar );
-            ret = 1;
-            run = 0;
-            return;
-        }
-        if( res == 2 )
-            break;
-        if( res == 1 )
-            MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
-        status->lockZeichnung();
-        status->setText( "Suche nach Updates . . ." );
-        status->unlockZeichnung();
-        gruppe = updater->getNextDateiGruppe( &dgPfad );
-    }
-    status->lockZeichnung();
-    status->setText( "Alle ausgewählten Dateien sind aktuell." );
-    status->unlockZeichnung();
-    play->addStyle( Knopf::Style::Sichtbar );
-    ret = 2;
-    HMODULE sDll = LoadLibrary( "data/bin/GSL.dll" );
-    if( sDll )
-    {
-        GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( sDll, "getGSLDatei" );
-        if( getGSLDatei )
-        {
-            GSL::GSLDateiV *sDatei = getGSLDatei();
-            sDatei->setDatei( "data/sounds/popup.gsl" );
-            sDatei->leseDaten();
-            GSL::GSLSoundV *sound = sDatei->getSound( "info.wav" );
-            sDatei->release();
-            int vol = userOptions->wertExistiert( "GUISound" ) ? *userOptions->zWert( "GUISound" ) : 100;
-            sound->setVolume( (int)( ( vol / 100.0 ) * 0xFFFF ), (int)( ( vol / 100.0 ) * 0xFFFF ) );
-            sound->playSound();
-            sound->warteAufSound( 3000 );
-            sound->stopSound();
-            sound->release();
-        }
-        FreeLibrary( sDll );
-    }
-    run = 0;
+	if (!updater)
+	{
+		status->lockZeichnung();
+		status->setText("Es ist ein schwerer Fehler aufgetreten!");
+		status->unlockZeichnung();
+		run = 0;
+		return;
+	}
+	status->lockZeichnung();
+	status->setText("Suche nach Updates . . .");
+	status->unlockZeichnung();
+	Text dgPfad;
+	int gruppe = updater->getNextDateiGruppe(&dgPfad); // Nächste Dateigruppe die geupdatet werden muss
+	while (gruppe)
+	{
+		if (gruppe == -1)
+		{ // error
+			status->lockZeichnung();
+			status->setText("Es ist ein schwerer Fehler aufgetreten!");
+			status->unlockZeichnung();
+			MessageBox(0, updater->getError(), "Fehler", MB_ICONERROR);
+			run = 0;
+			return;
+		}
+		bool clientGruppe = !dgPfad.getLength();
+		if (!clientGruppe)
+		{ // Das Spiel kann bereits gestartet werden
+			play->addStyle(Knopf::Style::Sichtbar);
+			ret = 2;
+		}
+		status->lockZeichnung();
+		status->setText("Update für '");
+		if (!clientGruppe)
+			status->zText()->append(dgPfad.getText());
+		else
+			status->zText()->append("Client");
+		status->zText()->append("'. . .");
+		status->unlockZeichnung();
+		UpdateParams params;
+		params.abbruch = close;
+		params.dateiGruppe = gruppe;
+		params.zFortschritt = fortschritt;
+		params.zStatus = 0;
+		int res = updater->update(&params);
+		if (res == 3)
+		{ // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
+			status->lockZeichnung();
+			status->setText("Klicke auf Play, um die verbleibenen Änderungen zu übernehmen.");
+			status->unlockZeichnung();
+			play->addStyle(Knopf::Style::Sichtbar);
+			ret = 1;
+			run = 0;
+			return;
+		}
+		if (res == 2)
+			break;
+		if (res == 1)
+			MessageBox(0, updater->getError(), "Fehler", MB_ICONERROR);
+		status->lockZeichnung();
+		status->setText("Suche nach Updates . . .");
+		status->unlockZeichnung();
+		gruppe = updater->getNextDateiGruppe(&dgPfad);
+	}
+	status->lockZeichnung();
+	status->setText("Alle ausgewählten Dateien sind aktuell.");
+	status->unlockZeichnung();
+	play->addStyle(Knopf::Style::Sichtbar);
+	ret = 2;
+	HMODULE sDll = LoadLibrary("data/bin/GSL.dll");
+	if (sDll)
+	{
+		GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress(sDll, "getGSLDatei");
+		if (getGSLDatei)
+		{
+			GSL::GSLDateiV* sDatei = getGSLDatei();
+			sDatei->setDatei("data/sounds/popup.gsl");
+			sDatei->leseDaten();
+			GSL::GSLSoundV* sound = sDatei->getSound("info.wav");
+			sDatei->release();
+			int vol = userOptions->wertExistiert("GUISound") ? (int)*userOptions->zWert("GUISound") : 100;
+			sound->setVolume((int)((vol / 100.0) * 0xFFFF), (int)((vol / 100.0) * 0xFFFF));
+			sound->playSound();
+			sound->warteAufSound(3000);
+			sound->stopSound();
+			sound->release();
+		}
+		FreeLibrary(sDll);
+	}
+	run = 0;
 }
 
 // constant
 bool Patcher::läuftPatch() const
 {
-    return run;
+	return run;
 }
 
 int Patcher::getReturn() const
 {
-    return ret;
+	return ret;
 }
 
-void Patcher::warteAufPatch( int zeit )
+void Patcher::warteAufPatch(int zeit)
 {
-    warteAufThread( zeit );
+	warteAufThread(zeit);
 }
 
 int Patcher::getDownload() const
 {
-    return updater ? updater->getDownload() : 0;
+	return updater ? updater->getDownload() : 0;
 }

+ 19 - 19
patcher/Patcher.h

@@ -13,27 +13,27 @@ using namespace Framework;
 class Patcher : public Thread
 {
 private:
-    HMODULE updateDll;
-    UpdaterV *updater;
-    FBalken *fortschritt;
-    TextFeld *status;
-    Knopf *play;
-    bool *close;
-    int ret;
+	HMODULE updateDll;
+	UpdaterV* updater;
+	FBalken* fortschritt;
+	TextFeld* status;
+	Knopf* play;
+	bool* close;
+	int ret;
 
 public:
-    // Konstruktor
-    Patcher( FBalken *fortschritt, TextFeld *status, Knopf *play, bool *close, KSGClient::PatchServerClient *client );
-    // Destruktor
-    ~Patcher();
-    // nicht constant
-    void startPatch();
-    void thread();
-    // constant
-    bool läuftPatch() const;
-    int getReturn() const;
-    void warteAufPatch( int zeit );
-    int getDownload() const;
+	// Konstruktor
+	Patcher(FBalken* fortschritt, TextFeld* status, Knopf* play, bool* close, KSGClient::PatchServerClient* client);
+	// Destruktor
+	~Patcher();
+	// nicht constant
+	void startPatch();
+	void thread();
+	// constant
+	bool läuftPatch() const;
+	int getReturn() const;
+	void warteAufPatch(int zeit);
+	int getDownload() const;
 };
 
 #endif

+ 4 - 4
patcher/patcher.vcxproj

@@ -29,27 +29,27 @@
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">

+ 811 - 811
patcher/start.cpp

@@ -32,867 +32,867 @@ using namespace Framework;
 using namespace Network;
 
 bool _exitB = 0;
-WFenster *_frame;
-FBalken *_fortschritt;
-TextFeld *_aktion;
-TextFeld *_kbps;
-Knopf *_play;
-Patcher *_patcher;
-Fenster *_optionenF;
-ObjTabelle *_o_rt;
-Knopf *_o_rno;
-Knopf *_o_rnu;
-TextFeld *_o_ülps;
-AuswahlBox *_o_üle;
-InitDatei *userOptions;
+WFenster* _frame;
+FBalken* _fortschritt;
+TextFeld* _aktion;
+TextFeld* _kbps;
+Knopf* _play;
+Patcher* _patcher;
+Fenster* _optionenF;
+ObjTabelle* _o_rt;
+Knopf* _o_rno;
+Knopf* _o_rnu;
+TextFeld* _o_ülps;
+AuswahlBox* _o_üle;
+InitDatei* userOptions;
 
 bool _newWechsel = 1;
 bool _abbruch = 0;
 
-bool _o_rkkME( void *p, void *obj, MausEreignis me );
+bool _o_rkkME(void* p, void* obj, MausEreignis me);
 
-void _frameSchließen( void *p, void *obj )
+void _frameSchließen(void* p, void* obj)
 {
 
 }
 
-bool _frameME( void *p, void *obj, MausEreignis me )
+bool _frameME(void* p, void* obj, MausEreignis me)
 {
-    return 1;
+	return 1;
 }
 
-bool _frameTE( void *p, void *obj, TastaturEreignis me )
+bool _frameTE(void* p, void* obj, TastaturEreignis me)
 {
-    return 1;
+	return 1;
 }
 
-bool closeME( void *p, void *obj, MausEreignis me )
+bool closeME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-    {
-        _abbruch = 1;
-        PostQuitMessage( 0 );
-    }
-    return 1;
+	if (me.id == ME_RLinks)
+	{
+		_abbruch = 1;
+		PostQuitMessage(0);
+	}
+	return 1;
 }
 
-bool minimierenME( void *p, void *obj, MausEreignis me )
+bool minimierenME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-    {
-        _frame->setAnzeigeModus( 2 );
-    }
-    return 1;
+	if (me.id == ME_RLinks)
+	{
+		_frame->setAnzeigeModus(2);
+	}
+	return 1;
 }
 
-bool _playME( void *p, void *obj, MausEreignis me )
+bool _playME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_Betritt )
-        getMaus().ladeMaus( MausId::hand );
-    if( me.id == ME_Leaves )
-        getMaus().ladeMaus( MausId::normal );
-    getMaus().update();
-    if( me.id == ME_RLinks )
-        PostQuitMessage( 0 );
-    return 1;
+	if (me.id == ME_Betritt)
+		getMaus().ladeMaus(MausId::hand);
+	if (me.id == ME_Leaves)
+		getMaus().ladeMaus(MausId::normal);
+	getMaus().update();
+	if (me.id == ME_RLinks)
+		PostQuitMessage(0);
+	return 1;
 }
 
-bool optionenME( void *p, void *obj, MausEreignis me )
+bool optionenME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-    {
-        _o_rno->removeStyle( Knopf::Style::Erlaubt );
-        _o_rnu->removeStyle( Knopf::Style::Erlaubt );
-        while( _o_rt->getZeilenAnzahl() > 1 )
-            _o_rt->removeZeile( 1 );
-        KSGTDatei *dat = new KSGTDatei( "data/dg.ksgt" ); // Tabellen Spalten: Id, Pfad, Version, Priorität
-        dat->laden();
-        int max = -1;
-        for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
-        {
-            if( !dat->zFeld( i, 3 ) || dat->zFeld( i, 3 )->istGleich( "NICHT" ) || dat->zFeld( i, 3 )->istGleich( "" ) )
-                continue;
-            if( max < (int)TextZuInt( dat->zFeld( i, 3 )->getText(), 10 ) )
-                max = (int)TextZuInt( dat->zFeld( i, 3 )->getText(), 10 );
-        }
-        for( int i = 0; i <= max; i++ )
-        {
-            for( int j = 0; j < dat->getZeilenAnzahl(); j++ )
-            {
-                if( !dat->zFeld( j, 1 ) || dat->zFeld( j, 1 )->istGleich( "" ) )
-                    continue;
-                Text *iT = new Text( "" );
-                iT->append( i );
-                if( dat->zFeld( j, 3 ) && dat->zFeld( j, 3 )->istGleich( iT ) )
-                {
-                    Text *name = dat->zFeld( j, 1 )->getTeilText( dat->zFeld( j, 1 )->positionVon( "spiele/" ) + 7 );
-                    if( !name || !name->getLength() || !dat->zFeld( j, 1 )->hat( "spiele/" ) )
-                    {
-                        if( name )
-                            name->release();
-                        name = dat->zFeld( j, 1 )->getTeilText( dat->zFeld( j, 1 )->positionVon( "Spiele/" ) + 7 );
-                    }
-                    if( !name || !name->getLength() || ( !dat->zFeld( j, 1 )->hat( "Spiele/" ) && !dat->zFeld( j, 1 )->hat( "spiele/" ) ) )
-                    {
-                        if( name )
-                            name->release();
-                        name = new Text( dat->zFeld( j, 1 )->getText() );
-                        if( name->hat( '/' ) )
-                            name->remove( 0, name->positionVon( '/', name->anzahlVon( '/' ) - 1 ) + 1 );
-                    }
-                    int anz = _o_rt->getZeilenAnzahl();
-                    _o_rt->addZeile( dat->zFeld( j, 0 )->getText() );
-                    Text *spielN = 0;
-                    if( name->positionVon( '/' ) >= 0 )
-                        spielN = name->getTeilText( 0, name->positionVon( '/' ) );
-                    else
-                        spielN = new Text( name->getText() );
-                    name->release();
-                    TextFeld *spiel = new TextFeld();
-                    spiel->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-                    spiel->setSchriftZ( _optionenF->getTSchrift() );
-                    spiel->setSchriftFarbe( 0xFFFFFFFF );
-                    spiel->setHintergrundFarbe( 0xFF003000 );
-                    spiel->setText( spielN );
-                    _o_rt->setZeichnungZ( 0, anz, spiel );
-                    KontrollKnopf *erlaubt = new KontrollKnopf();
-                    erlaubt->addStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer | KontrollKnopf::Style::Selected );
-                    erlaubt->setHintergrundFarbe( 0xFF003000 );
-                    erlaubt->setSBgFarbe( 0xFF003000 );
-                    erlaubt->loadData( "data/bilder/system.ltdb" );
-                    erlaubt->setMausEreignis( _o_rkkME );
-                    _o_rt->setZeichnungZ( 1, anz, erlaubt );
-                }
-            }
-        }
-        for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
-        {
-            if( dat->zFeld( i, 3 ) && dat->zFeld( i, 3 )->istGleich( "NICHT" ) )
-            {
-                Text *name = dat->zFeld( i, 1 )->getTeilText( dat->zFeld( i, 1 )->positionVon( "spiele/" ) + 7 );
-                if( !name || !name->getLength() )
-                {
-                    if( name )
-                        name->release();
-                    name = dat->zFeld( i, 1 )->getTeilText( dat->zFeld( i, 1 )->positionVon( "Spiele/" ) + 7 );
-                }
-                if( !name || !name->getLength() )
-                {
-                    if( name )
-                        name->release();
-                    name = new Text( dat->zFeld( i, 1 )->getText() );
-                    if( name->hat( '/' ) )
-                        name->remove( 0, name->positionVon( '/', name->anzahlVon( '/' ) - 1 ) );
-                }
-                int anz = _o_rt->getZeilenAnzahl();
-                _o_rt->addZeile( dat->zFeld( i, 0 )->getText() );
-                Text *spielN = 0;
-                if( name->positionVon( '/' ) >= 0 )
-                    spielN = name->getTeilText( 0, name->positionVon( '/' ) );
-                else
-                    spielN = new Text( name->getText() );
-                name->release();
-                TextFeld *spiel = new TextFeld();
-                spiel->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-                spiel->setSchriftZ( _optionenF->getTSchrift() );
-                spiel->setSchriftFarbe( 0xFFFFFFFF );
-                spiel->setHintergrundFarbe( 0xFF003000 );
-                spiel->setText( spielN );
-                _o_rt->setZeichnungZ( 0, anz, spiel );
-                KontrollKnopf *erlaubt = new KontrollKnopf();
-                erlaubt->addStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer );
-                erlaubt->setHintergrundFarbe( 0xFF003000 );
-                erlaubt->loadData( "data/bilder/system.ltdb" );
-                erlaubt->setMausEreignis( _o_rkkME );
-                _o_rt->setZeichnungZ( 1, anz, erlaubt );
-            }
-        }
-        dat->release();
-        InitDatei *ini = new InitDatei( "data/patch/po.ini" );
-        ini->laden();
-        if( ini->wertExistiert( "ülps" ) )
-            _o_ülps->setText( ini->zWert( "ülps" )->getText() );
-        if( ini->wertExistiert( "üle" ) )
-            _o_üle->setAuswahl( _o_üle->getEintragPos( ini->zWert( "üle" )->getText() ) );
-        ini->release();
-        _optionenF->setPosition( 100, 100 );
-        _optionenF->addStyle( Fenster::Style::Sichtbar );
-    }
-    return 1;
+	if (me.id == ME_RLinks)
+	{
+		_o_rno->removeStyle(Knopf::Style::Erlaubt);
+		_o_rnu->removeStyle(Knopf::Style::Erlaubt);
+		while (_o_rt->getZeilenAnzahl() > 1)
+			_o_rt->removeZeile(1);
+		KSGTDatei* dat = new KSGTDatei("data/dg.ksgt"); // Tabellen Spalten: Id, Pfad, Version, Priorität
+		dat->laden();
+		int max = -1;
+		for (int i = 0; i < dat->getZeilenAnzahl(); i++)
+		{
+			if (!dat->zFeld(i, 3) || dat->zFeld(i, 3)->istGleich("NICHT") || dat->zFeld(i, 3)->istGleich(""))
+				continue;
+			if (max < (int)TextZuInt(dat->zFeld(i, 3)->getText(), 10))
+				max = (int)TextZuInt(dat->zFeld(i, 3)->getText(), 10);
+		}
+		for (int i = 0; i <= max; i++)
+		{
+			for (int j = 0; j < dat->getZeilenAnzahl(); j++)
+			{
+				if (!dat->zFeld(j, 1) || dat->zFeld(j, 1)->istGleich(""))
+					continue;
+				Text* iT = new Text("");
+				iT->append(i);
+				if (dat->zFeld(j, 3) && dat->zFeld(j, 3)->istGleich(iT))
+				{
+					Text* name = dat->zFeld(j, 1)->getTeilText(dat->zFeld(j, 1)->positionVon("spiele/") + 7);
+					if (!name || !name->getLength() || !dat->zFeld(j, 1)->hat("spiele/"))
+					{
+						if (name)
+							name->release();
+						name = dat->zFeld(j, 1)->getTeilText(dat->zFeld(j, 1)->positionVon("Spiele/") + 7);
+					}
+					if (!name || !name->getLength() || (!dat->zFeld(j, 1)->hat("Spiele/") && !dat->zFeld(j, 1)->hat("spiele/")))
+					{
+						if (name)
+							name->release();
+						name = new Text(dat->zFeld(j, 1)->getText());
+						if (name->hat('/'))
+							name->remove(0, name->positionVon('/', name->anzahlVon('/') - 1) + 1);
+					}
+					int anz = _o_rt->getZeilenAnzahl();
+					_o_rt->addZeile(dat->zFeld(j, 0)->getText());
+					Text* spielN = 0;
+					if (name->positionVon('/') >= 0)
+						spielN = name->getTeilText(0, name->positionVon('/'));
+					else
+						spielN = new Text(name->getText());
+					name->release();
+					TextFeld* spiel = new TextFeld();
+					spiel->setStyle(TextFeld::Style::Sichtbar | TextFeld::Style::Center);
+					spiel->setSchriftZ(_optionenF->getTSchrift());
+					spiel->setSchriftFarbe(0xFFFFFFFF);
+					spiel->setHintergrundFarbe(0xFF003000);
+					spiel->setText(spielN);
+					_o_rt->setZeichnungZ(0, anz, spiel);
+					KontrollKnopf* erlaubt = new KontrollKnopf();
+					erlaubt->addStyle(KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer | KontrollKnopf::Style::Selected);
+					erlaubt->setHintergrundFarbe(0xFF003000);
+					erlaubt->setSBgFarbe(0xFF003000);
+					erlaubt->loadData("data/bilder/system.ltdb");
+					erlaubt->setMausEreignis(_o_rkkME);
+					_o_rt->setZeichnungZ(1, anz, erlaubt);
+				}
+			}
+		}
+		for (int i = 0; i < dat->getZeilenAnzahl(); i++)
+		{
+			if (dat->zFeld(i, 3) && dat->zFeld(i, 3)->istGleich("NICHT"))
+			{
+				Text* name = dat->zFeld(i, 1)->getTeilText(dat->zFeld(i, 1)->positionVon("spiele/") + 7);
+				if (!name || !name->getLength())
+				{
+					if (name)
+						name->release();
+					name = dat->zFeld(i, 1)->getTeilText(dat->zFeld(i, 1)->positionVon("Spiele/") + 7);
+				}
+				if (!name || !name->getLength())
+				{
+					if (name)
+						name->release();
+					name = new Text(dat->zFeld(i, 1)->getText());
+					if (name->hat('/'))
+						name->remove(0, name->positionVon('/', name->anzahlVon('/') - 1));
+				}
+				int anz = _o_rt->getZeilenAnzahl();
+				_o_rt->addZeile(dat->zFeld(i, 0)->getText());
+				Text* spielN = 0;
+				if (name->positionVon('/') >= 0)
+					spielN = name->getTeilText(0, name->positionVon('/'));
+				else
+					spielN = new Text(name->getText());
+				name->release();
+				TextFeld* spiel = new TextFeld();
+				spiel->setStyle(TextFeld::Style::Sichtbar | TextFeld::Style::Center);
+				spiel->setSchriftZ(_optionenF->getTSchrift());
+				spiel->setSchriftFarbe(0xFFFFFFFF);
+				spiel->setHintergrundFarbe(0xFF003000);
+				spiel->setText(spielN);
+				_o_rt->setZeichnungZ(0, anz, spiel);
+				KontrollKnopf* erlaubt = new KontrollKnopf();
+				erlaubt->addStyle(KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer);
+				erlaubt->setHintergrundFarbe(0xFF003000);
+				erlaubt->loadData("data/bilder/system.ltdb");
+				erlaubt->setMausEreignis(_o_rkkME);
+				_o_rt->setZeichnungZ(1, anz, erlaubt);
+			}
+		}
+		dat->release();
+		InitDatei* ini = new InitDatei("data/patch/po.ini");
+		ini->laden();
+		if (ini->wertExistiert("ülps"))
+			_o_ülps->setText(ini->zWert("ülps")->getText());
+		if (ini->wertExistiert("üle"))
+			_o_üle->setAuswahl(_o_üle->getEintragPos(ini->zWert("üle")->getText()));
+		ini->release();
+		_optionenF->setPosition(100, 100);
+		_optionenF->addStyle(Fenster::Style::Sichtbar);
+	}
+	return 1;
 }
 
-bool oAbbrechen( void *p, void *obj, MausEreignis me )
+bool oAbbrechen(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-        _optionenF->removeStyle( Fenster::Style::Sichtbar );
-    return 1;
+	if (me.id == ME_RLinks)
+		_optionenF->removeStyle(Fenster::Style::Sichtbar);
+	return 1;
 }
 
-bool _o_rtME( void *p, void *obj, MausEreignis me )
+bool _o_rtME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-    {
-        for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-        {
-            if( _o_rt->zZeichnung( 0, i ) )
-                ( (TextFeld *)_o_rt->zZeichnung( 0, i ) )->removeStyle( TextFeld::Style::Hintergrund );
-            if( _o_rt->zZeichnung( 1, i ) )
-                ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->removeStyle( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe );
-        }
-        int zeile = (int)_o_rt->getMausZeile( me.my - _o_rt->getVertikalScrollPos() );
-        if( zeile <= 0 )
-        {
-            _o_rno->removeStyle( Knopf::Style::Erlaubt );
-            _o_rnu->removeStyle( Knopf::Style::Erlaubt );
-        }
-        else
-        {
-            if( _o_rt->zZeichnung( 0, zeile ) )
-                ( (TextFeld *)_o_rt->zZeichnung( 0, zeile ) )->addStyle( TextFeld::Style::Hintergrund );
-            if( _o_rt->zZeichnung( 1, zeile ) )
-                ( (KontrollKnopf *)_o_rt->zZeichnung( 1, zeile ) )->addStyle( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe );
-            if( zeile > 1 )
-                _o_rno->addStyle( Knopf::Style::Erlaubt );
-            else
-                _o_rno->removeStyle( Knopf::Style::Erlaubt );
-            int max = 0;
-            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-            {
-                if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
-                    break;
-                max = i;
-            }
-            if( zeile < max )
-                _o_rnu->addStyle( Knopf::Style::Erlaubt );
-            else
-                _o_rnu->removeStyle( Knopf::Style::Erlaubt );
-            if( ( _o_rt->zZeichnung( 1, zeile ) && ( (KontrollKnopf *)_o_rt->zZeichnung( 1, zeile ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) ) )
-            {
-                _o_rno->removeStyle( Knopf::Style::Erlaubt );
-                _o_rnu->removeStyle( Knopf::Style::Erlaubt );
-            }
-        }
-    }
-    return 1;
+	if (me.id == ME_RLinks)
+	{
+		for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+		{
+			if (_o_rt->zZeichnung(0, i))
+				((TextFeld*)_o_rt->zZeichnung(0, i))->removeStyle(TextFeld::Style::Hintergrund);
+			if (_o_rt->zZeichnung(1, i))
+				((KontrollKnopf*)_o_rt->zZeichnung(1, i))->removeStyle(KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe);
+		}
+		int zeile = (int)_o_rt->getMausZeile(me.my - _o_rt->getVertikalScrollPos());
+		if (zeile <= 0)
+		{
+			_o_rno->removeStyle(Knopf::Style::Erlaubt);
+			_o_rnu->removeStyle(Knopf::Style::Erlaubt);
+		}
+		else
+		{
+			if (_o_rt->zZeichnung(0, zeile))
+				((TextFeld*)_o_rt->zZeichnung(0, zeile))->addStyle(TextFeld::Style::Hintergrund);
+			if (_o_rt->zZeichnung(1, zeile))
+				((KontrollKnopf*)_o_rt->zZeichnung(1, zeile))->addStyle(KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe);
+			if (zeile > 1)
+				_o_rno->addStyle(Knopf::Style::Erlaubt);
+			else
+				_o_rno->removeStyle(Knopf::Style::Erlaubt);
+			int max = 0;
+			for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+			{
+				if (!_o_rt->zZeichnung(1, i) || ((KontrollKnopf*)_o_rt->zZeichnung(1, i))->hatStyleNicht(KontrollKnopf::Style::Selected))
+					break;
+				max = i;
+			}
+			if (zeile < max)
+				_o_rnu->addStyle(Knopf::Style::Erlaubt);
+			else
+				_o_rnu->removeStyle(Knopf::Style::Erlaubt);
+			if ((_o_rt->zZeichnung(1, zeile) && ((KontrollKnopf*)_o_rt->zZeichnung(1, zeile))->hatStyleNicht(KontrollKnopf::Style::Selected)))
+			{
+				_o_rno->removeStyle(Knopf::Style::Erlaubt);
+				_o_rnu->removeStyle(Knopf::Style::Erlaubt);
+			}
+		}
+	}
+	return 1;
 }
 
-bool _o_rnoME( void *p, void *obj, MausEreignis me )
+bool _o_rnoME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-    {
-        int zeile = -1;
-        for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-        {
-            if( _o_rt->zZeichnung( 0, i ) && ( (TextFeld *)_o_rt->zZeichnung( 0, i ) )->hatStyle( TextFeld::Style::Hintergrund ) )
-            {
-                zeile = i;
-                break;
-            }
-        }
-        if( zeile > 1 )
-        {
-            _o_rt->setZeilePosition( zeile, zeile - 1 );
-            _o_rnu->addStyle( Knopf::Style::Erlaubt );
-        }
-        if( zeile - 1 <= 1 )
-            _o_rno->removeStyle( Knopf::Style::Erlaubt );
-    }
-    return 1;
+	if (me.id == ME_RLinks)
+	{
+		int zeile = -1;
+		for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+		{
+			if (_o_rt->zZeichnung(0, i) && ((TextFeld*)_o_rt->zZeichnung(0, i))->hatStyle(TextFeld::Style::Hintergrund))
+			{
+				zeile = i;
+				break;
+			}
+		}
+		if (zeile > 1)
+		{
+			_o_rt->setZeilePosition(zeile, zeile - 1);
+			_o_rnu->addStyle(Knopf::Style::Erlaubt);
+		}
+		if (zeile - 1 <= 1)
+			_o_rno->removeStyle(Knopf::Style::Erlaubt);
+	}
+	return 1;
 }
 
-bool _o_rnuME( void *p, void *obj, MausEreignis me )
+bool _o_rnuME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-    {
-        int zeile = -1;
-        for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-        {
-            if( _o_rt->zZeichnung( 0, i ) && ( (TextFeld *)_o_rt->zZeichnung( 0, i ) )->hatStyle( TextFeld::Style::Hintergrund ) )
-            {
-                zeile = i;
-                break;
-            }
-        }
-        int max = 0;
-        for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-        {
-            if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
-                break;
-            max = i;
-        }
-        if( zeile > 0 && zeile < max )
-        {
-            _o_rt->setZeilePosition( zeile, zeile + 1 );
-            _o_rno->addStyle( Knopf::Style::Erlaubt );
-        }
-        if( zeile + 1 >= _o_rt->getZeilenAnzahl() - 1 )
-            _o_rnu->removeStyle( Knopf::Style::Erlaubt );
-    }
-    return 1;
+	if (me.id == ME_RLinks)
+	{
+		int zeile = -1;
+		for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+		{
+			if (_o_rt->zZeichnung(0, i) && ((TextFeld*)_o_rt->zZeichnung(0, i))->hatStyle(TextFeld::Style::Hintergrund))
+			{
+				zeile = i;
+				break;
+			}
+		}
+		int max = 0;
+		for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+		{
+			if (!_o_rt->zZeichnung(1, i) || ((KontrollKnopf*)_o_rt->zZeichnung(1, i))->hatStyleNicht(KontrollKnopf::Style::Selected))
+				break;
+			max = i;
+		}
+		if (zeile > 0 && zeile < max)
+		{
+			_o_rt->setZeilePosition(zeile, zeile + 1);
+			_o_rno->addStyle(Knopf::Style::Erlaubt);
+		}
+		if (zeile + 1 >= _o_rt->getZeilenAnzahl() - 1)
+			_o_rnu->removeStyle(Knopf::Style::Erlaubt);
+	}
+	return 1;
 }
 
-bool _o_rkkME( void *p, void *obj, MausEreignis me )
+bool _o_rkkME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-    {
-        if( ( (KontrollKnopf *)obj )->hatStyleNicht( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe ) )
-        {
-            ( (KontrollKnopf *)obj )->setStyle( KontrollKnopf::Style::Selected, ( (KontrollKnopf *)obj )->hatStyleNicht( KontrollKnopf::Style::Selected ) );
-            return 1;
-        }
-        if( ( (KontrollKnopf *)obj )->hatStyle( KontrollKnopf::Style::Selected ) )
-        {
-            _o_rno->removeStyle( Knopf::Style::Erlaubt );
-            _o_rnu->removeStyle( Knopf::Style::Erlaubt );
-            int zeile = -1;
-            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-            {
-                if( _o_rt->zZeichnung( 1, i ) == obj )
-                {
-                    zeile = i;
-                    break;
-                }
-            }
-            int max = 0;
-            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-            {
-                if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
-                    break;
-                max = i;
-            }
-            _o_rt->setZeilePosition( zeile, max );
-        }
-        else
-        {
-            int zeile = -1;
-            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-            {
-                if( _o_rt->zZeichnung( 1, i ) == obj )
-                {
-                    zeile = i;
-                    break;
-                }
-            }
-            int max = 0;
-            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-            {
-                if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
-                    break;
-                max = i;
-            }
-            _o_rt->setZeilePosition( zeile, max + 1 );
-            if( max > 1 )
-                _o_rno->addStyle( Knopf::Style::Erlaubt );
-        }
-    }
-    return 1;
+	if (me.id == ME_RLinks)
+	{
+		if (((KontrollKnopf*)obj)->hatStyleNicht(KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe))
+		{
+			((KontrollKnopf*)obj)->setStyle(KontrollKnopf::Style::Selected, ((KontrollKnopf*)obj)->hatStyleNicht(KontrollKnopf::Style::Selected));
+			return 1;
+		}
+		if (((KontrollKnopf*)obj)->hatStyle(KontrollKnopf::Style::Selected))
+		{
+			_o_rno->removeStyle(Knopf::Style::Erlaubt);
+			_o_rnu->removeStyle(Knopf::Style::Erlaubt);
+			int zeile = -1;
+			for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+			{
+				if (_o_rt->zZeichnung(1, i) == obj)
+				{
+					zeile = i;
+					break;
+				}
+			}
+			int max = 0;
+			for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+			{
+				if (!_o_rt->zZeichnung(1, i) || ((KontrollKnopf*)_o_rt->zZeichnung(1, i))->hatStyleNicht(KontrollKnopf::Style::Selected))
+					break;
+				max = i;
+			}
+			_o_rt->setZeilePosition(zeile, max);
+		}
+		else
+		{
+			int zeile = -1;
+			for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+			{
+				if (_o_rt->zZeichnung(1, i) == obj)
+				{
+					zeile = i;
+					break;
+				}
+			}
+			int max = 0;
+			for (int i = 1; i < _o_rt->getZeilenAnzahl(); i++)
+			{
+				if (!_o_rt->zZeichnung(1, i) || ((KontrollKnopf*)_o_rt->zZeichnung(1, i))->hatStyleNicht(KontrollKnopf::Style::Selected))
+					break;
+				max = i;
+			}
+			_o_rt->setZeilePosition(zeile, max + 1);
+			if (max > 1)
+				_o_rno->addStyle(Knopf::Style::Erlaubt);
+		}
+	}
+	return 1;
 }
 
-bool _o_ülpsTE( void *p, void *obj, TastaturEreignis te )
+bool _o_ülpsTE(void* p, void* obj, TastaturEreignis te)
 {
-    if( te.taste == T_Links || te.taste == T_Rechts || te.taste == T_Entf || te.taste == T_BackSpace || ( te.taste >= '0' && te.taste <= '9' ) )
-        return 1;
-    return 0;
+	if (te.taste == T_Links || te.taste == T_Rechts || te.taste == T_Entf || te.taste == T_BackSpace || (te.taste >= '0' && te.taste <= '9'))
+		return 1;
+	return 0;
 }
 
-bool o_okME( void *p, void *obj, MausEreignis me )
+bool o_okME(void* p, void* obj, MausEreignis me)
 {
-    if( me.id == ME_RLinks )
-    {
-        KSGTDatei *dat = new KSGTDatei( "data/dg.ksgt" );
-        dat->laden();
-        for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
-        {
-            for( int j = 0; j < _o_rt->getZeilenAnzahl(); j++ )
-            {
-                if( !_o_rt->zZeichnung( 1, j ) )
-                    continue;
-                if( !_o_rt->zZeilenName( j )->istGleich( dat->zFeld( i, 0 )->getText() ) )
-                    continue;
-                if( ( (KontrollKnopf *)_o_rt->zZeichnung( 1, j ) )->hatStyle( KontrollKnopf::Style::Selected ) )
-                {
-                    Text *t = new Text();
-                    t->append( j );
-                    dat->zFeld( i, 3 )->setText( t );
-                }
-                else
-                    dat->zFeld( i, 3 )->setText( "NICHT" );
-                break;
-            }
-        }
-        dat->speichern();
-        dat->release();
-        InitDatei *ini = new InitDatei( "data/patch/po.ini" );
-        ini->addWert( "ülps", _o_ülps->zText()->getText() );
-        ini->addWert( "üle", _o_üle->zEintragText( _o_üle->getAuswahl() )->getText() );
-        ini->speichern();
-        ini->release();
-        _optionenF->removeStyle( Fenster::Style::Sichtbar );
-    }
-    return 1;
+	if (me.id == ME_RLinks)
+	{
+		KSGTDatei* dat = new KSGTDatei("data/dg.ksgt");
+		dat->laden();
+		for (int i = 0; i < dat->getZeilenAnzahl(); i++)
+		{
+			for (int j = 0; j < _o_rt->getZeilenAnzahl(); j++)
+			{
+				if (!_o_rt->zZeichnung(1, j))
+					continue;
+				if (!_o_rt->zZeilenName(j)->istGleich(dat->zFeld(i, 0)->getText()))
+					continue;
+				if (((KontrollKnopf*)_o_rt->zZeichnung(1, j))->hatStyle(KontrollKnopf::Style::Selected))
+				{
+					Text* t = new Text();
+					t->append(j);
+					dat->zFeld(i, 3)->setText(t);
+				}
+				else
+					dat->zFeld(i, 3)->setText("NICHT");
+				break;
+			}
+		}
+		dat->speichern();
+		dat->release();
+		InitDatei* ini = new InitDatei("data/patch/po.ini");
+		ini->addWert("ülps", _o_ülps->zText()->getText());
+		ini->addWert("üle", _o_üle->zEintragText(_o_üle->getAuswahl())->getText());
+		ini->speichern();
+		ini->release();
+		_optionenF->removeStyle(Fenster::Style::Sichtbar);
+	}
+	return 1;
 }
 
-DWORD WINAPI runThread( void *args )
+DWORD WINAPI runThread(void* args)
 {
-    Bildschirm *screen = (Bildschirm *)args;
-    double i = 0;
-    double tickVal = 1.0 / 60.0;
-    ZeitMesser *tstop = new ZeitMesser();
-    while( !_exitB )
-    {
-        tstop->messungStart();
-        screen->render();
-        screen->tick( tickVal );
-        Sleep( 10 );
-        if( _kbps )
-        {
-            i += tickVal * 60;
-            if( i >= 60 && _kbps )
-            {
-                screen->lock();
-                _kbps->setText( "" );
-                _kbps->zText()->append( _patcher ? ( _patcher->getDownload() / 1024 ) : 0 );
-                _kbps->zText()->append( " kb/s, " );
-                _kbps->zText()->append( (unsigned int)( ( _fortschritt->getAktionAnzahl() - _fortschritt->getAktion() ) / 1024 ) );
-                _kbps->zText()->append( " kb verbleibend..." );
-                screen->unlock();
-                i -= 60;
-            }
-        }
-        tstop->messungEnde();
-        tickVal = tstop->getSekunden() + tstop->getSekunden() - tickVal;
-    }
-    tstop->release();
-    return 0;
+	Bildschirm* screen = (Bildschirm*)args;
+	double i = 0;
+	double tickVal = 1.0 / 60.0;
+	ZeitMesser* tstop = new ZeitMesser();
+	while (!_exitB)
+	{
+		tstop->messungStart();
+		screen->render();
+		screen->tick(tickVal);
+		Sleep(10);
+		if (_kbps)
+		{
+			i += tickVal * 60;
+			if (i >= 60 && _kbps)
+			{
+				screen->lock();
+				_kbps->setText("");
+				_kbps->zText()->append(_patcher ? (_patcher->getDownload() / 1024) : 0);
+				_kbps->zText()->append(" kb/s, ");
+				_kbps->zText()->append((unsigned int)((_fortschritt->getAktionAnzahl() - _fortschritt->getAktion()) / 1024));
+				_kbps->zText()->append(" kb verbleibend...");
+				screen->unlock();
+				i -= 60;
+			}
+		}
+		tstop->messungEnde();
+		tickVal = tstop->getSekunden() + tstop->getSekunden() - tickVal;
+	}
+	tstop->release();
+	return 0;
 }
 
-int KSGStart Framework::Start( Startparam p )
+int KSGStart Framework::Start(Startparam p)
 {
-    _abbruch = 0;
-    Network::Start( 10 );
-
-    if( !DateiExistiert( "data/user_options.ini" ) )
-    {
-        userOptions = new InitDatei( "data/default_options.ini" );
-        userOptions->laden();
-        userOptions->setPfad( "data/user_options.ini" );
-        userOptions->speichern();
-    }
-    else
-    {
-        userOptions = new InitDatei( "data/user_options.ini" );
-        userOptions->laden();
-    }
-
-    LTDBDatei *patcherBilder = new LTDBDatei();
-    patcherBilder->setDatei( new Text( "data/patch/bilder/patcher.ltdb" ) );
-    patcherBilder->leseDaten( 0 );
-    Bild *patcherRahmen = patcherBilder->laden( 0, new Text( "patcherrahmen." ) );
-    Bild *patcherHintergrund = patcherBilder->laden( 0, new Text( "patcher.png" ) );
-    Bild *playBild = patcherBilder->laden( 0, new Text( "play.png" ) );
-    Bild *playKlick = patcherBilder->laden( 0, new Text( "playklick.png" ) );
-    patcherBilder->release();
-
-    LTDBDatei *systemBilder = new LTDBDatei();
-    systemBilder->setDatei( new Text( "data/bilder/system.ltdb" ) );
-    systemBilder->leseDaten( 0 );
-    Bild *systemSchließen = systemBilder->laden( 0, new Text( "schließen.png" ) );
-    Bild *systemMinimieren = systemBilder->laden( 0, new Text( "minimieren.png" ) );
-    Bild *systemOptionen = systemBilder->laden( 0, new Text( "optionen.png" ) );
-    Bild *systemFortschrittL = systemBilder->laden( 0, new Text( "fortschrittleh" ) );
-    Bild *systemFortschrittV = systemBilder->laden( 0, new Text( "fortschrittvol" ) );
-    systemBilder->release();
-
-    LTDSDatei *normalSchrift = new LTDSDatei();
-    normalSchrift->setPfad( new Text( "data/schriften/normal.ltds" ) );
-    normalSchrift->leseDaten();
-    Schrift *sNormal = normalSchrift->ladeSchrift();
-    normalSchrift->release();
-
-    Monitor m = getMonitor( userOptions->wertExistiert( "Monitor" ) ? *userOptions->zWert( "Monitor" ) : 0 );
-    WNDCLASS wc = F_Normal( p.hinst );
-    wc.lpszClassName = "Kolja-Strohm Games Patcher";
-    _frame = new WFenster();
-    _frame->setVerschiebbar( 1 );
-    _frame->erstellen( WS_POPUP, wc );
-    _frame->setSize( Punkt( 500, 500 ) );
-    _frame->setPosition( Bildschirmmitte( dynamic_cast<WFenster *>( _frame->getThis() ), m.existiert ? ( userOptions->wertExistiert( "Monitor" ) ? *userOptions->zWert( "Monitor" ) : 0 ) : 0 ) );
-    _frame->ladeRahmenFenster( patcherRahmen, p.hinst );
-    _frame->setMausAktion( _frameME );
-    _frame->setTastaturAktion( _frameTE );
-    _frame->setVSchließAktion( _frameSchließen );
-    Bildschirm *screen = 0;
-    if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX9" ) )
-        screen = new Bildschirm3D( dynamic_cast<WFenster *>( _frame->getThis() ), DIRECTX9 );
-    else if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX11" ) )
-        screen = new Bildschirm3D( dynamic_cast<WFenster *>( _frame->getThis() ), DIRECTX11 );
-    else if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX12" ) )
-        screen = new Bildschirm3D( dynamic_cast<WFenster *>( _frame->getThis() ), DIRECTX12 );
-    else
-        screen = new Bildschirm3D( dynamic_cast<WFenster *>( _frame->getThis() ) );
-    screen->update();
-    screen->render();
-    _frame->setBildschirm( dynamic_cast<Bildschirm *>( screen->getThis() ) );
-    _frame->setAnzeigeModus( 1 );
-
-    screen->lock();
-    BildZ *hintergrund = new BildZ();
-    hintergrund->setStyle( BildZ::Style::Sichtbar );
-    hintergrund->setBildZ( dynamic_cast<Bild *>( patcherHintergrund->getThis() ) );
-    hintergrund->setPosition( 0, 0 );
-    hintergrund->setSize( patcherHintergrund->getBreite(), patcherHintergrund->getHeight() );
-    screen->addMember( hintergrund );
-
-    Knopf *close = new Knopf();
-    close->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-    close->setHintergrundBildZ( dynamic_cast<Bild *>( systemSchließen->getThis() ) );
-    close->setKBFarbe( 0xFF000000 );
-    close->setHintergrundFarbe( 0 );
-    close->setKBStrength( 30 );
-    close->setPosition( 475, 5 );
-    close->setSize( 20, 20 );
-    close->setMausEreignis( closeME );
-    screen->addMember( close );
-
-    Knopf *minimieren = new Knopf();
-    minimieren->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-    minimieren->setHintergrundBildZ( dynamic_cast<Bild *>( systemMinimieren->getThis() ) );
-    minimieren->setHintergrundFarbe( 0 );
-    minimieren->setKBFarbe( 0xFF000000 );
-    minimieren->setKBStrength( 30 );
-    minimieren->setPosition( 454, 5 );
-    minimieren->setSize( 20, 20 );
-    minimieren->setMausEreignis( minimierenME );
-    screen->addMember( minimieren );
-
-    Knopf *optionen = new Knopf();
-    optionen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-    optionen->setHintergrundBildZ( dynamic_cast<Bild *>( systemOptionen->getThis() ) );
-    optionen->setHintergrundFarbe( 0 );
-    optionen->setKBFarbe( 0xFF000000 );
-    optionen->setKBStrength( 30 );
-    optionen->setPosition( 433, 5 );
-    optionen->setSize( 20, 20 );
-    optionen->setMausEreignis( optionenME );
-    screen->addMember( optionen );
-
-    // Main Server Adresse Laden
-    Datei *dat = new Datei();
-    dat->setDatei( "data/tmp/k.id" );
-    int klientNummer = 0;
-    dat->open( Datei::Style::lesen );
-    dat->lese( (char *)&klientNummer, 4 );
-    dat->close();
-    dat->setDatei( "data/tmp/m.port" );
-    int serverPort = 0;
-    dat->open( Datei::Style::lesen );
-    dat->lese( (char *)&serverPort, 4 );
-    dat->close();
-    dat->setDatei( "data/tmp/m.ip" );
-    dat->open( Datei::Style::lesen );
-    unsigned char len = 0;
-    dat->lese( (char *)&len, 1 );
-    char *ip = new char[ len + 1 ];
-    ip[ len ] = 0;
-    dat->lese( ip, len );
-    dat->close();
-    dat->setDatei( "data/tmp/crypt.key" );
-    dat->open( Datei::Style::lesen );
-    len = 0;
-    dat->lese( (char *)&len, 1 );
-    char *key = new char[ len + 1 ];
-    key[ len ] = 0;
-    dat->lese( key, len );
-    dat->close();
-    dat->release();
-
-    // Laden des Main Clients
-    HINSTANCE networkDLL = LoadLibrary( "data/bin/KSGNetwork.dll" );
-    if( !networkDLL )
-    {
-        WMessageBox( 0, new Text( "Fehler" ), new Text( "Die DLL Datei 'data/bin/KSGNetwork.dll' konnte nicht geladen werden. Fallst diese Datei nicht existiert muss das Spiel neu Installiert werden." ), MB_ICONERROR );
-        exit( 0 );
-    }
-    KSGClient::KSGNetworkCreateRegisterdMain getMainClient = (KSGClient::KSGNetworkCreateRegisterdMain)GetProcAddress( networkDLL, KSGNETWORK_CREATE_REGISTERD_MAIN );
-    if( !getMainClient )
-    {
-        WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGNETWORK_CREATE_REGISTERD_MAIN "' wurde in der DLL Datei 'data/bin/KSGNetwork.dll' nicht gefunden. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden." ), MB_ICONERROR );
-        exit( 0 );
-    }
-    KSGClient::MainServerClient *mainClient = getMainClient( ip, serverPort, klientNummer, key, len );
-    if( !mainClient )
-    {
-        WMessageBox( 0, new Text( "Fehler" ), new Text( "Die DLL Datei 'data/bin/KSGNetwork.dll' scheint fehlerhaft zu sein. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden." ), MB_ICONERROR );
-        exit( 0 );
-    }
-
-    delete[] ip;
-    delete[] key;
-
-    UIInit init = Framework::defaultUI( sNormal, screen );
-
-    News *news = new News( init, mainClient->createNewsServerClient() );
-
-    _aktion = new TextFeld();
-    _aktion->setStyle( TextFeld::Style::Sichtbar );
-    _aktion->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    _aktion->setSchriftFarbe( 0xFFFFFFFF );
-    _aktion->setText( "Ermittle änderungen..." );
-    _aktion->setPosition( 49, 403 );
-    _aktion->setSize( 502, 20 );
-    screen->addMember( dynamic_cast<Zeichnung *>( _aktion->getThis() ) );
-
-    _kbps = new TextFeld();
-    _kbps->setStyle( TextFeld::Style::Sichtbar );
-    _kbps->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    _kbps->setSchriftFarbe( 0xFFFFFFFF );
-    _kbps->setText( "0 kb/s" );
-    _kbps->setPosition( 49, 460 );
-    _kbps->setSize( 402, 20 );
-    screen->addMember( dynamic_cast<Zeichnung *>( _kbps->getThis() ) );
-
-    _fortschritt = new FBalken();
-    _fortschritt->setStyle( FBalken::Style::Sichtbar | FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::FBild | FBalken::Style::Rahmen | FBalken::Style::Prozent | FBalken::Style::L_R );
-    _fortschritt->setRahmenFarbe( 0xFFFFFFFF );
-    _fortschritt->setHintergrundBild( dynamic_cast<Bild *>( systemFortschrittL->getThis() ) );
-    _fortschritt->setFBgBild( dynamic_cast<Bild *>( systemFortschrittV->getThis() ) );
-    _fortschritt->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    _fortschritt->setSFarbe( 0xFFFFFFFF );
-    _fortschritt->setSSize( 12 );
-    _fortschritt->setPosition( 49, 428 );
-    _fortschritt->setSize( 402, 22 );
-    screen->addMember( dynamic_cast<Zeichnung *>( _fortschritt->getThis() ) );
-
-    _play = new Knopf();
-    _play->setStyle( Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBild );
-    _play->setMausEreignis( _playME );
-    _play->setHintergrundBildZ( dynamic_cast<Bild *>( playBild->getThis() ) );
-    _play->setKlickBildZ( dynamic_cast<Bild *>( playKlick->getThis() ) );
-    _play->setPosition( 200, 466 );
-    _play->setSize( 101, 30 );
-    screen->addMember( dynamic_cast<Zeichnung *>( _play->getThis() ) );
-
-    _optionenF = new Fenster();
-    _optionenF->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Closable | Fenster::Style::Titel | Fenster::Style::TitelBuffered |
-                          Fenster::Style::TitelHintergrund | Fenster::Style::BodyHintergrund | Fenster::Style::TitelHAlpha |
-                          Fenster::Style::BodyHAlpha | Fenster::Style::Rahmen | Fenster::Style::ClosingKlickBuffer |
-                          Fenster::Style::ClosingHintergrund | Fenster::Style::ClosingHAlpha | Fenster::Style::Beweglich | Fenster::Style::VScroll );
-    _optionenF->setSize( 300, 330 );
-    _optionenF->setPosition( 100, 100 );
-    _optionenF->setVSBMax( 300 );
-    _optionenF->zVScrollBar()->setKlickScroll( 10 );
-    _optionenF->zVScrollBar()->setFarbe( 0xFFFFFFFF );
-    _optionenF->zVScrollBar()->setBgFarbe( 0xF0000000, 1 );
-    _optionenF->setRBreite( 2 );
-    _optionenF->setRFarbe( 0xFFFFFFFF );
-    _optionenF->setTSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    _optionenF->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    _optionenF->setTitel( "Optionen" );
-    _optionenF->zTTextFeld()->setSize( 0, 20 );
-    _optionenF->setTBgFarbe( 0xF0000000 );
-    _optionenF->setTAfFarbe( 0xA0FFFFFF );
-    _optionenF->setTAfStrength( 15 );
-    _optionenF->setTSFarbe( 0xFFFFFFFF );
-    _optionenF->setSBgFarbe( 0xF0000000 );
-    _optionenF->setSKAfFarbe( 0xFFFFFFFF );
-    _optionenF->setSKAfStrength( 30 );
-    _optionenF->setKBgFarbe( 0xF0000000 );
-    _optionenF->setClosingMe( oAbbrechen );
-    screen->addMember( dynamic_cast<Zeichnung *>( _optionenF->getThis() ) );
-
-    TextFeld *oReihenfolge = new TextFeld();
-    oReihenfolge->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::VCenter );
-    oReihenfolge->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    oReihenfolge->setSchriftFarbe( 0xFFFFFFFF );
-    oReihenfolge->setText( "Update Reihenfolge:" );
-    oReihenfolge->setPosition( 2, 2 );
-    oReihenfolge->setSize( 276, 20 );
-    _optionenF->addMember( oReihenfolge );
-
-    _o_rt = new ObjTabelle();
-    _o_rt->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen |
-                     ObjTabelle::Style::Raster | ObjTabelle::Style::VScroll );
-    _o_rt->setPosition( 2, 24 );
-    _o_rt->setSize( 276, 150 );
-    _o_rt->setRahmenBreite( 1 );
-    _o_rt->setRahmenFarbe( 0xFFFFFFFF );
-    _o_rt->setRasterBreite( 1 );
-    _o_rt->setRasterFarbe( 0xFFFFFFFF );
-    _o_rt->setVertikalKlickScroll( 10 );
-    _o_rt->setMausEreignis( _o_rtME );
-    _o_rt->addSpalte( "Spiel" );
-    _o_rt->addSpalte( "Erlaubt" );
-    _o_rt->setSpaltenBreite( 0, 237 );
-    _o_rt->setSpaltenBreite( 1, 20 );
-    _o_rt->addZeile( "Überschrift" );
-    _o_rt->setZeilenHeight( 0, 15 );
-    TextFeld *ortSpielT = new TextFeld();
-    ortSpielT->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    ortSpielT->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    ortSpielT->setSchriftFarbe( 0xFFFFFFFF );
-    ortSpielT->setText( "Spiel" );
-    _o_rt->setZeichnungZ( 0, 0, ortSpielT );
-    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_rt->getThis() ) );
-
-    _o_rno = new Knopf();
-    _o_rno->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-    _o_rno->setPosition( 76, 176 );
-    _o_rno->setSize( 100, 20 );
-    _o_rno->setText( "nach Oben" );
-    _o_rno->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    _o_rno->setMausEreignis( _o_rnoME );
-    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_rno->getThis() ) );
-
-    _o_rnu = new Knopf();
-    _o_rnu->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-    _o_rnu->setPosition( 178, 176 );
-    _o_rnu->setSize( 100, 20 );
-    _o_rnu->setText( "nach Unten" );
-    _o_rnu->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    _o_rnu->setMausEreignis( _o_rnuME );
-    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_rnu->getThis() ) );
-
-    TextFeld *oLimit = new TextFeld();
-    oLimit->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::VCenter );
-    oLimit->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    oLimit->setSchriftFarbe( 0xFFFFFFFF );
-    oLimit->setText( "Übertragungslimit pro Sekunde:" );
-    oLimit->setPosition( 2, 200 );
-    oLimit->setSize( 276, 20 );
-    _optionenF->addMember( oLimit );
-
-    _o_ülps = new TextFeld();
-    _o_ülps->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-    _o_ülps->setPosition( 2, 222 );
-    _o_ülps->setSize( 100, 20 );
-    _o_ülps->setRahmenFarbe( 0xFF00FF00 );
-    _o_ülps->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    _o_ülps->setText( "" );
-    _o_ülps->setSchriftFarbe( 0xFFFFFFFF );
-    _o_ülps->setSchriftSize( 12 );
-    _o_ülps->setAlphaFeldFarbe( 0x5500FF00 );
-    _o_ülps->setAlphaFeldStrength( -5 );
-    _o_ülps->setTastaturEreignis( _o_ülpsTE );
-    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_ülps->getThis() ) );
-
-    _o_üle = new AuswahlBox();
-    _o_üle->setStyle( AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::AuswahlBuffer |
-                      AuswahlBox::Style::MausBuffer | AuswahlBox::Style::Hintergrund );
-    _o_üle->setPosition( 104, 222 );
-    _o_üle->setSize( 55, 20 );
-    _o_üle->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    _o_üle->setRahmenFarbe( 0xFFFFFFFF );
-    _o_üle->setHintergrundFarbe( 0xFF000000 );
-    _o_üle->setAuswAlphaFeldFarbe( 0x5500FF00 );
-    _o_üle->setAuswAlphaFeldStrength( -5 );
-    _o_üle->setMausAlphaFeldFarbe( 0x2200FF00 );
-    _o_üle->setMausAlphaFeldStrength( -5 );
-    _o_üle->setMausEreignis( _ret1ME );
-    _o_üle->setTastaturEreignis( _ret1TE );
-    _o_üle->addEintrag( "kb/s" );
-    _o_üle->addEintrag( "mb/s" );
-    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_üle->getThis() ) );
-
-    bool exitPatcher = 0;
-
-    Knopf *o_repair = new Knopf();
-    o_repair->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-    o_repair->setPosition( 5, 254 );
-    o_repair->setSize( 100, 20 );
-    o_repair->setText( "Reparieren" );
-    o_repair->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    o_repair->setMausEreignis( [mainClient, &exitPatcher]( void *p, void *o, MausEreignis me )
-    {
-        if( me.id == ME_RLinks )
-        {
-            _optionenF->removeStyle( Fenster::Style::Sichtbar );
-            exitPatcher = 1;
-            _patcher->warteAufPatch( INFINITE );
-            KSGTDatei dgs;
-            dgs.setPfad( "data/dg.ksgt" );
-            dgs.laden();
-            for( int i = 0; i < dgs.getZeilenAnzahl(); i++ )
-            {
-                if( dgs.zFeld( i, 1 )->getLength() )
-                    DateiRemove( dgs.zFeld( i, 1 )->getText() );
-            }
-            DateiRemove( "data/dg.ksgt" );
-            DateiRemove( "data/update" );
-            DateiRemove( "data/versionen.ini" );
-            _patcher->release();
-            exitPatcher = 0;
-            _patcher = new Patcher( dynamic_cast<FBalken *>( _fortschritt->getThis() ), dynamic_cast<TextFeld *>( _aktion->getThis() ), dynamic_cast<Knopf *>( _play->getThis() ), &exitPatcher, mainClient->createPatchServerClient() );
-            _patcher->startPatch();
-        }
-        return 1;
-    } );
-    _optionenF->addMember( o_repair );
-
-    Knopf *o_ok = new Knopf();
-    o_ok->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-    o_ok->setPosition( 178, 284 );
-    o_ok->setSize( 100, 20 );
-    o_ok->setText( "Fertig" );
-    o_ok->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
-    o_ok->setMausEreignis( o_okME );
-    _optionenF->addMember( o_ok );
-
-    screen->unlock();
-
-    DWORD threadId;
-    HANDLE handle = CreateThread( NULL, 0, runThread, screen, 0, &threadId );
-
-    _patcher = new Patcher( dynamic_cast<FBalken *>( _fortschritt->getThis() ), dynamic_cast<TextFeld *>( _aktion->getThis() ), dynamic_cast<Knopf *>( _play->getThis() ), &exitPatcher, mainClient->createPatchServerClient() );
-    _patcher->startPatch();
-
-    StartNachrichtenSchleife();
-
-    _exitB = 1;
-    WaitForSingleObject( handle, INFINITE );
-
-    news->warteAufThread( 10000 );
-    news->ende();
-    news->release();
-
-    exitPatcher = 1;
-    _patcher->warteAufPatch( INFINITE );
-    int returnVal = _patcher->getReturn();
-    _patcher->release();
-
-    _optionenF->release();
-    _o_rt->release();
-    _o_rno->release();
-    _o_rnu->release();
-    _o_ülps->release();
-    _o_üle->release();
-
-    _fortschritt->release();
-    _aktion->release();
-    _kbps->release();
-    _play->release();
-    sNormal->release();
-
-    patcherRahmen->release();
-    patcherHintergrund->release();
-    playBild->release();
-    playKlick->release();
-    systemSchließen->release();
-    systemMinimieren->release();
-    systemOptionen->release();
-    systemFortschrittL->release();
-    systemFortschrittV->release();
-
-    screen->release();
-    _frame->setBildschirm( 0 );
-    _frame->zerstören();
-    _frame->release();
-    mainClient->release();
-    userOptions->release();
-    Network::Exit();
-
-    DateiPfadErstellen( new Text( "data/tmp/keinabsturz" ) );
-
-    if( _abbruch )
-        return 0;
-    return returnVal;
+	_abbruch = 0;
+	Network::Start(10);
+
+	if (!DateiExistiert("data/user_options.ini"))
+	{
+		userOptions = new InitDatei("data/default_options.ini");
+		userOptions->laden();
+		userOptions->setPfad("data/user_options.ini");
+		userOptions->speichern();
+	}
+	else
+	{
+		userOptions = new InitDatei("data/user_options.ini");
+		userOptions->laden();
+	}
+
+	LTDBDatei* patcherBilder = new LTDBDatei();
+	patcherBilder->setDatei(new Text("data/patch/bilder/patcher.ltdb"));
+	patcherBilder->leseDaten(0);
+	Bild* patcherRahmen = patcherBilder->laden(0, new Text("patcherrahmen."));
+	Bild* patcherHintergrund = patcherBilder->laden(0, new Text("patcher.png"));
+	Bild* playBild = patcherBilder->laden(0, new Text("play.png"));
+	Bild* playKlick = patcherBilder->laden(0, new Text("playklick.png"));
+	patcherBilder->release();
+
+	LTDBDatei* systemBilder = new LTDBDatei();
+	systemBilder->setDatei(new Text("data/bilder/system.ltdb"));
+	systemBilder->leseDaten(0);
+	Bild* systemSchließen = systemBilder->laden(0, new Text("schließen.png"));
+	Bild* systemMinimieren = systemBilder->laden(0, new Text("minimieren.png"));
+	Bild* systemOptionen = systemBilder->laden(0, new Text("optionen.png"));
+	Bild* systemFortschrittL = systemBilder->laden(0, new Text("fortschrittleh"));
+	Bild* systemFortschrittV = systemBilder->laden(0, new Text("fortschrittvol"));
+	systemBilder->release();
+
+	LTDSDatei* normalSchrift = new LTDSDatei();
+	normalSchrift->setPfad(new Text("data/schriften/normal.ltds"));
+	normalSchrift->leseDaten();
+	Schrift* sNormal = normalSchrift->ladeSchrift();
+	normalSchrift->release();
+
+	Monitor m = getMonitor(userOptions->wertExistiert("Monitor") ? (int)*userOptions->zWert("Monitor") : 0);
+	WNDCLASS wc = F_Normal(p.hinst);
+	wc.lpszClassName = "Kolja-Strohm Games Patcher";
+	_frame = new WFenster();
+	_frame->setVerschiebbar(1);
+	_frame->erstellen(WS_POPUP, wc);
+	_frame->setSize(Punkt(500, 500));
+	_frame->setPosition(Bildschirmmitte(dynamic_cast<WFenster*>(_frame->getThis()), m.existiert ? (userOptions->wertExistiert("Monitor") ? (int)*userOptions->zWert("Monitor") : 0) : 0));
+	_frame->ladeRahmenFenster(patcherRahmen, p.hinst);
+	_frame->setMausAktion(_frameME);
+	_frame->setTastaturAktion(_frameTE);
+	_frame->setVSchließAktion(_frameSchließen);
+	Bildschirm* screen = 0;
+	if (userOptions->wertExistiert("GraphicAPI") && userOptions->zWert("GraphicAPI")->istGleich("DX9"))
+		screen = new Bildschirm3D(dynamic_cast<WFenster*>(_frame->getThis()), DIRECTX9);
+	else if (userOptions->wertExistiert("GraphicAPI") && userOptions->zWert("GraphicAPI")->istGleich("DX11"))
+		screen = new Bildschirm3D(dynamic_cast<WFenster*>(_frame->getThis()), DIRECTX11);
+	else if (userOptions->wertExistiert("GraphicAPI") && userOptions->zWert("GraphicAPI")->istGleich("DX12"))
+		screen = new Bildschirm3D(dynamic_cast<WFenster*>(_frame->getThis()), DIRECTX12);
+	else
+		screen = new Bildschirm3D(dynamic_cast<WFenster*>(_frame->getThis()));
+	screen->update();
+	screen->render();
+	_frame->setBildschirm(dynamic_cast<Bildschirm*>(screen->getThis()));
+	_frame->setAnzeigeModus(1);
+
+	screen->lock();
+	BildZ* hintergrund = new BildZ();
+	hintergrund->setStyle(BildZ::Style::Sichtbar);
+	hintergrund->setBildZ(dynamic_cast<Bild*>(patcherHintergrund->getThis()));
+	hintergrund->setPosition(0, 0);
+	hintergrund->setSize(patcherHintergrund->getBreite(), patcherHintergrund->getHeight());
+	screen->addMember(hintergrund);
+
+	Knopf* close = new Knopf();
+	close->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
+	close->setHintergrundBildZ(dynamic_cast<Bild*>(systemSchließen->getThis()));
+	close->setKBFarbe(0xFF000000);
+	close->setHintergrundFarbe(0);
+	close->setKBStrength(30);
+	close->setPosition(475, 5);
+	close->setSize(20, 20);
+	close->setMausEreignis(closeME);
+	screen->addMember(close);
+
+	Knopf* minimieren = new Knopf();
+	minimieren->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
+	minimieren->setHintergrundBildZ(dynamic_cast<Bild*>(systemMinimieren->getThis()));
+	minimieren->setHintergrundFarbe(0);
+	minimieren->setKBFarbe(0xFF000000);
+	minimieren->setKBStrength(30);
+	minimieren->setPosition(454, 5);
+	minimieren->setSize(20, 20);
+	minimieren->setMausEreignis(minimierenME);
+	screen->addMember(minimieren);
+
+	Knopf* optionen = new Knopf();
+	optionen->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
+	optionen->setHintergrundBildZ(dynamic_cast<Bild*>(systemOptionen->getThis()));
+	optionen->setHintergrundFarbe(0);
+	optionen->setKBFarbe(0xFF000000);
+	optionen->setKBStrength(30);
+	optionen->setPosition(433, 5);
+	optionen->setSize(20, 20);
+	optionen->setMausEreignis(optionenME);
+	screen->addMember(optionen);
+
+	// Main Server Adresse Laden
+	Datei* dat = new Datei();
+	dat->setDatei("data/tmp/k.id");
+	int klientNummer = 0;
+	dat->open(Datei::Style::lesen);
+	dat->lese((char*)&klientNummer, 4);
+	dat->close();
+	dat->setDatei("data/tmp/m.port");
+	int serverPort = 0;
+	dat->open(Datei::Style::lesen);
+	dat->lese((char*)&serverPort, 4);
+	dat->close();
+	dat->setDatei("data/tmp/m.ip");
+	dat->open(Datei::Style::lesen);
+	unsigned char len = 0;
+	dat->lese((char*)&len, 1);
+	char* ip = new char[len + 1];
+	ip[len] = 0;
+	dat->lese(ip, len);
+	dat->close();
+	dat->setDatei("data/tmp/crypt.key");
+	dat->open(Datei::Style::lesen);
+	len = 0;
+	dat->lese((char*)&len, 1);
+	char* key = new char[len + 1];
+	key[len] = 0;
+	dat->lese(key, len);
+	dat->close();
+	dat->release();
+
+	// Laden des Main Clients
+	HINSTANCE networkDLL = LoadLibrary("data/bin/KSGNetwork.dll");
+	if (!networkDLL)
+	{
+		WMessageBox(0, new Text("Fehler"), new Text("Die DLL Datei 'data/bin/KSGNetwork.dll' konnte nicht geladen werden. Fallst diese Datei nicht existiert muss das Spiel neu Installiert werden."), MB_ICONERROR);
+		exit(0);
+	}
+	KSGClient::KSGNetworkCreateRegisterdMain getMainClient = (KSGClient::KSGNetworkCreateRegisterdMain)GetProcAddress(networkDLL, KSGNETWORK_CREATE_REGISTERD_MAIN);
+	if (!getMainClient)
+	{
+		WMessageBox(0, new Text("Fehler"), new Text("Der Einstiegspunkt '" KSGNETWORK_CREATE_REGISTERD_MAIN "' wurde in der DLL Datei 'data/bin/KSGNetwork.dll' nicht gefunden. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden."), MB_ICONERROR);
+		exit(0);
+	}
+	KSGClient::MainServerClient* mainClient = getMainClient(ip, serverPort, klientNummer, key, len);
+	if (!mainClient)
+	{
+		WMessageBox(0, new Text("Fehler"), new Text("Die DLL Datei 'data/bin/KSGNetwork.dll' scheint fehlerhaft zu sein. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden."), MB_ICONERROR);
+		exit(0);
+	}
+
+	delete[] ip;
+	delete[] key;
+
+	UIInit init = Framework::defaultUI(sNormal, screen);
+
+	News* news = new News(init, mainClient->createNewsServerClient());
+
+	_aktion = new TextFeld();
+	_aktion->setStyle(TextFeld::Style::Sichtbar);
+	_aktion->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	_aktion->setSchriftFarbe(0xFFFFFFFF);
+	_aktion->setText("Ermittle änderungen...");
+	_aktion->setPosition(49, 403);
+	_aktion->setSize(502, 20);
+	screen->addMember(dynamic_cast<Zeichnung*>(_aktion->getThis()));
+
+	_kbps = new TextFeld();
+	_kbps->setStyle(TextFeld::Style::Sichtbar);
+	_kbps->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	_kbps->setSchriftFarbe(0xFFFFFFFF);
+	_kbps->setText("0 kb/s");
+	_kbps->setPosition(49, 460);
+	_kbps->setSize(402, 20);
+	screen->addMember(dynamic_cast<Zeichnung*>(_kbps->getThis()));
+
+	_fortschritt = new FBalken();
+	_fortschritt->setStyle(FBalken::Style::Sichtbar | FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::FBild | FBalken::Style::Rahmen | FBalken::Style::Prozent | FBalken::Style::L_R);
+	_fortschritt->setRahmenFarbe(0xFFFFFFFF);
+	_fortschritt->setHintergrundBild(dynamic_cast<Bild*>(systemFortschrittL->getThis()));
+	_fortschritt->setFBgBild(dynamic_cast<Bild*>(systemFortschrittV->getThis()));
+	_fortschritt->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	_fortschritt->setSFarbe(0xFFFFFFFF);
+	_fortschritt->setSSize(12);
+	_fortschritt->setPosition(49, 428);
+	_fortschritt->setSize(402, 22);
+	screen->addMember(dynamic_cast<Zeichnung*>(_fortschritt->getThis()));
+
+	_play = new Knopf();
+	_play->setStyle(Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBild);
+	_play->setMausEreignis(_playME);
+	_play->setHintergrundBildZ(dynamic_cast<Bild*>(playBild->getThis()));
+	_play->setKlickBildZ(dynamic_cast<Bild*>(playKlick->getThis()));
+	_play->setPosition(200, 466);
+	_play->setSize(101, 30);
+	screen->addMember(dynamic_cast<Zeichnung*>(_play->getThis()));
+
+	_optionenF = new Fenster();
+	_optionenF->setStyle(Fenster::Style::Erlaubt | Fenster::Style::Closable | Fenster::Style::Titel | Fenster::Style::TitelBuffered |
+		Fenster::Style::TitelHintergrund | Fenster::Style::BodyHintergrund | Fenster::Style::TitelHAlpha |
+		Fenster::Style::BodyHAlpha | Fenster::Style::Rahmen | Fenster::Style::ClosingKlickBuffer |
+		Fenster::Style::ClosingHintergrund | Fenster::Style::ClosingHAlpha | Fenster::Style::Beweglich | Fenster::Style::VScroll);
+	_optionenF->setSize(300, 330);
+	_optionenF->setPosition(100, 100);
+	_optionenF->setVSBMax(300);
+	_optionenF->zVScrollBar()->setKlickScroll(10);
+	_optionenF->zVScrollBar()->setFarbe(0xFFFFFFFF);
+	_optionenF->zVScrollBar()->setBgFarbe(0xF0000000, 1);
+	_optionenF->setRBreite(2);
+	_optionenF->setRFarbe(0xFFFFFFFF);
+	_optionenF->setTSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	_optionenF->zTTextFeld()->addStyle(TextFeld::Style::Sichtbar | TextFeld::Style::Center);
+	_optionenF->setTitel("Optionen");
+	_optionenF->zTTextFeld()->setSize(0, 20);
+	_optionenF->setTBgFarbe(0xF0000000);
+	_optionenF->setTAfFarbe(0xA0FFFFFF);
+	_optionenF->setTAfStrength(15);
+	_optionenF->setTSFarbe(0xFFFFFFFF);
+	_optionenF->setSBgFarbe(0xF0000000);
+	_optionenF->setSKAfFarbe(0xFFFFFFFF);
+	_optionenF->setSKAfStrength(30);
+	_optionenF->setKBgFarbe(0xF0000000);
+	_optionenF->setClosingMe(oAbbrechen);
+	screen->addMember(dynamic_cast<Zeichnung*>(_optionenF->getThis()));
+
+	TextFeld* oReihenfolge = new TextFeld();
+	oReihenfolge->setStyle(TextFeld::Style::Sichtbar | TextFeld::Style::VCenter);
+	oReihenfolge->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	oReihenfolge->setSchriftFarbe(0xFFFFFFFF);
+	oReihenfolge->setText("Update Reihenfolge:");
+	oReihenfolge->setPosition(2, 2);
+	oReihenfolge->setSize(276, 20);
+	_optionenF->addMember(oReihenfolge);
+
+	_o_rt = new ObjTabelle();
+	_o_rt->setStyle(ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen |
+		ObjTabelle::Style::Raster | ObjTabelle::Style::VScroll);
+	_o_rt->setPosition(2, 24);
+	_o_rt->setSize(276, 150);
+	_o_rt->setRahmenBreite(1);
+	_o_rt->setRahmenFarbe(0xFFFFFFFF);
+	_o_rt->setRasterBreite(1);
+	_o_rt->setRasterFarbe(0xFFFFFFFF);
+	_o_rt->setVertikalKlickScroll(10);
+	_o_rt->setMausEreignis(_o_rtME);
+	_o_rt->addSpalte("Spiel");
+	_o_rt->addSpalte("Erlaubt");
+	_o_rt->setSpaltenBreite(0, 237);
+	_o_rt->setSpaltenBreite(1, 20);
+	_o_rt->addZeile("Überschrift");
+	_o_rt->setZeilenHeight(0, 15);
+	TextFeld* ortSpielT = new TextFeld();
+	ortSpielT->setStyle(TextFeld::Style::Sichtbar | TextFeld::Style::Center);
+	ortSpielT->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	ortSpielT->setSchriftFarbe(0xFFFFFFFF);
+	ortSpielT->setText("Spiel");
+	_o_rt->setZeichnungZ(0, 0, ortSpielT);
+	_optionenF->addMember(dynamic_cast<Zeichnung*>(_o_rt->getThis()));
+
+	_o_rno = new Knopf();
+	_o_rno->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen);
+	_o_rno->setPosition(76, 176);
+	_o_rno->setSize(100, 20);
+	_o_rno->setText("nach Oben");
+	_o_rno->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	_o_rno->setMausEreignis(_o_rnoME);
+	_optionenF->addMember(dynamic_cast<Zeichnung*>(_o_rno->getThis()));
+
+	_o_rnu = new Knopf();
+	_o_rnu->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen);
+	_o_rnu->setPosition(178, 176);
+	_o_rnu->setSize(100, 20);
+	_o_rnu->setText("nach Unten");
+	_o_rnu->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	_o_rnu->setMausEreignis(_o_rnuME);
+	_optionenF->addMember(dynamic_cast<Zeichnung*>(_o_rnu->getThis()));
+
+	TextFeld* oLimit = new TextFeld();
+	oLimit->setStyle(TextFeld::Style::Sichtbar | TextFeld::Style::VCenter);
+	oLimit->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	oLimit->setSchriftFarbe(0xFFFFFFFF);
+	oLimit->setText("Übertragungslimit pro Sekunde:");
+	oLimit->setPosition(2, 200);
+	oLimit->setSize(276, 20);
+	_optionenF->addMember(oLimit);
+
+	_o_ülps = new TextFeld();
+	_o_ülps->setStyle(TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter);
+	_o_ülps->setPosition(2, 222);
+	_o_ülps->setSize(100, 20);
+	_o_ülps->setRahmenFarbe(0xFF00FF00);
+	_o_ülps->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	_o_ülps->setText("");
+	_o_ülps->setSchriftFarbe(0xFFFFFFFF);
+	_o_ülps->setSchriftSize(12);
+	_o_ülps->setAlphaFeldFarbe(0x5500FF00);
+	_o_ülps->setAlphaFeldStrength(-5);
+	_o_ülps->setTastaturEreignis(_o_ülpsTE);
+	_optionenF->addMember(dynamic_cast<Zeichnung*>(_o_ülps->getThis()));
+
+	_o_üle = new AuswahlBox();
+	_o_üle->setStyle(AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::AuswahlBuffer |
+		AuswahlBox::Style::MausBuffer | AuswahlBox::Style::Hintergrund);
+	_o_üle->setPosition(104, 222);
+	_o_üle->setSize(55, 20);
+	_o_üle->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	_o_üle->setRahmenFarbe(0xFFFFFFFF);
+	_o_üle->setHintergrundFarbe(0xFF000000);
+	_o_üle->setAuswAlphaFeldFarbe(0x5500FF00);
+	_o_üle->setAuswAlphaFeldStrength(-5);
+	_o_üle->setMausAlphaFeldFarbe(0x2200FF00);
+	_o_üle->setMausAlphaFeldStrength(-5);
+	_o_üle->setMausEreignis(_ret1ME);
+	_o_üle->setTastaturEreignis(_ret1TE);
+	_o_üle->addEintrag("kb/s");
+	_o_üle->addEintrag("mb/s");
+	_optionenF->addMember(dynamic_cast<Zeichnung*>(_o_üle->getThis()));
+
+	bool exitPatcher = 0;
+
+	Knopf* o_repair = new Knopf();
+	o_repair->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen);
+	o_repair->setPosition(5, 254);
+	o_repair->setSize(100, 20);
+	o_repair->setText("Reparieren");
+	o_repair->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	o_repair->setMausEreignis([mainClient, &exitPatcher](void* p, void* o, MausEreignis me)
+		{
+			if (me.id == ME_RLinks)
+			{
+				_optionenF->removeStyle(Fenster::Style::Sichtbar);
+				exitPatcher = 1;
+				_patcher->warteAufPatch(INFINITE);
+				KSGTDatei dgs;
+				dgs.setPfad("data/dg.ksgt");
+				dgs.laden();
+				for (int i = 0; i < dgs.getZeilenAnzahl(); i++)
+				{
+					if (dgs.zFeld(i, 1)->getLength())
+						DateiRemove(dgs.zFeld(i, 1)->getText());
+				}
+				DateiRemove("data/dg.ksgt");
+				DateiRemove("data/update");
+				DateiRemove("data/versionen.ini");
+				_patcher->release();
+				exitPatcher = 0;
+				_patcher = new Patcher(dynamic_cast<FBalken*>(_fortschritt->getThis()), dynamic_cast<TextFeld*>(_aktion->getThis()), dynamic_cast<Knopf*>(_play->getThis()), &exitPatcher, mainClient->createPatchServerClient());
+				_patcher->startPatch();
+			}
+			return 1;
+		});
+	_optionenF->addMember(o_repair);
+
+	Knopf* o_ok = new Knopf();
+	o_ok->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen);
+	o_ok->setPosition(178, 284);
+	o_ok->setSize(100, 20);
+	o_ok->setText("Fertig");
+	o_ok->setSchriftZ(dynamic_cast<Schrift*>(sNormal->getThis()));
+	o_ok->setMausEreignis(o_okME);
+	_optionenF->addMember(o_ok);
+
+	screen->unlock();
+
+	DWORD threadId;
+	HANDLE handle = CreateThread(NULL, 0, runThread, screen, 0, &threadId);
+
+	_patcher = new Patcher(dynamic_cast<FBalken*>(_fortschritt->getThis()), dynamic_cast<TextFeld*>(_aktion->getThis()), dynamic_cast<Knopf*>(_play->getThis()), &exitPatcher, mainClient->createPatchServerClient());
+	_patcher->startPatch();
+
+	StartNachrichtenSchleife();
+
+	_exitB = 1;
+	WaitForSingleObject(handle, INFINITE);
+
+	news->warteAufThread(10000);
+	news->ende();
+	news->release();
+
+	exitPatcher = 1;
+	_patcher->warteAufPatch(INFINITE);
+	int returnVal = _patcher->getReturn();
+	_patcher->release();
+
+	_optionenF->release();
+	_o_rt->release();
+	_o_rno->release();
+	_o_rnu->release();
+	_o_ülps->release();
+	_o_üle->release();
+
+	_fortschritt->release();
+	_aktion->release();
+	_kbps->release();
+	_play->release();
+	sNormal->release();
+
+	patcherRahmen->release();
+	patcherHintergrund->release();
+	playBild->release();
+	playKlick->release();
+	systemSchließen->release();
+	systemMinimieren->release();
+	systemOptionen->release();
+	systemFortschrittL->release();
+	systemFortschrittV->release();
+
+	screen->release();
+	_frame->setBildschirm(0);
+	_frame->zerstören();
+	_frame->release();
+	mainClient->release();
+	userOptions->release();
+	Network::Exit();
+
+	DateiPfadErstellen(new Text("data/tmp/keinabsturz"));
+
+	if (_abbruch)
+		return 0;
+	return returnVal;
 }