فهرست منبع

Projektdateien hinzufügen.

Kolja Strohm 7 سال پیش
والد
کامیت
06f238019b

+ 30 - 0
Shop Server.sln

@@ -0,0 +1,30 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26020.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShopServer", "ShopServer\ShopServer.vcxproj", "{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|ARM = Debug|ARM
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|ARM = Release|ARM
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}.Debug|ARM.ActiveCfg = Debug|x64
+		{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}.Debug|x64.ActiveCfg = Debug|x64
+		{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}.Debug|x64.Build.0 = Debug|x64
+		{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}.Debug|x86.ActiveCfg = Debug|x64
+		{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}.Release|ARM.ActiveCfg = Release|x64
+		{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}.Release|x64.ActiveCfg = Release|x64
+		{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}.Release|x64.Build.0 = Release|x64
+		{E9AAEF53-0FD8-4D09-B683-F1890BB87A4A}.Release|x86.ActiveCfg = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 730 - 0
ShopServer/Datenbank.cpp

@@ -0,0 +1,730 @@
+#include "Datenbank.h"
+#include <iostream>
+
+// Inhalt der LSDatenbank Klasse aus Datenbank.h
+// Konstruktor
+ShSDatenbank::ShSDatenbank( InitDatei *zIni )
+{
+    datenbank = new Datenbank( zIni->zWert( "DBBenutzer" )->getText(), zIni->zWert( "DBPasswort" )->getText(),
+        zIni->zWert( "DBName" )->getText(), zIni->zWert( "DBIP" )->getText(),
+        (unsigned short)TextZuInt( zIni->zWert( "DBPort" )->getText(), 10 ) );
+    if( !datenbank->istOk() )
+    {
+        std::cout << "ShS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
+        exit( 1 );
+    }
+    InitializeCriticalSection( &cs );
+    ref = 1;
+    Text befehl = "SELECT port, admin_port  FROM server WHERE id = ";
+    befehl += zIni->zWert( "ServerId" )->getText();
+    sid = (int)*zIni->zWert( "ServerId" );
+    lock();
+    datenbank->befehl( befehl );
+    Result res = datenbank->getResult();
+    unlock();
+    if( res.zeilenAnzahl == 1 )
+    {
+        zIni->addWert( "ServerPort", res.values[ 0 ] );
+        zIni->addWert( "AdminServerPort", res.values[ 1 ] );
+    }
+    res.destroy();
+}
+
+// Destruktor
+ShSDatenbank::~ShSDatenbank()
+{
+    datenbank->release();
+    DeleteCriticalSection( &cs );
+}
+
+// nicht constant
+void ShSDatenbank::lock()
+{
+    EnterCriticalSection( &cs );
+}
+
+void ShSDatenbank::unlock()
+{
+    LeaveCriticalSection( &cs );
+}
+
+int ShSDatenbank::istAdministrator( const char *name, const char *passwort )
+{
+    Text *befehl = new Text( "SELECT id FROM benutzer WHERE name = '" );
+    Text n( name );
+    n.ersetzen( "'", "''" );
+    befehl->append( (char*)n );
+    befehl->append( "' AND passwort = md5( '" );
+    Text p( passwort );
+    p.ersetzen( "'", "''" );
+    befehl->append( (char*)p );
+    befehl->append( "' )" );
+    lock();
+    datenbank->befehl( befehl->getText() );
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    int ret = 0;
+    if( res.zeilenAnzahl > 0 )
+        ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+    res.destroy();
+    return ret;
+}
+
+bool ShSDatenbank::adminHatRecht( int id, int recht )
+{
+    Text *befehl = new Text( "SELECT * FROM benutzer_rechte WHERE benutzer_id = " );
+    befehl->append( id );
+    befehl->append( " AND rechte_id = " );
+    befehl->append( recht );
+    lock();
+    datenbank->befehl( befehl->getText() );
+    int ret = datenbank->getZeilenAnzahl();
+    unlock();
+    befehl->release();
+    return ret != 0;
+}
+
+bool ShSDatenbank::proveKlient( int num, int sNum )
+{
+    Text *befehl = new Text( "SELECT * FROM server_client WHERE server_id = " );
+    befehl->append( sNum );
+    befehl->append( " AND client_id = " );
+    befehl->append( num );
+    lock();
+    datenbank->befehl( befehl->getText() );
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    bool ret = 0;
+    if( res.zeilenAnzahl == 1 )
+        ret = 1;
+    res.destroy();
+    return ret;
+}
+
+Text *ShSDatenbank::getKlientKey( int cId )
+{
+    lock();
+    if( !datenbank->befehl( Text( "SELECT schluessel FROM client WHERE id = " ) += cId ) )
+    {
+        unlock();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    Text *ret = new Text( res.values[ 0 ].getText() );
+    res.destroy();
+    return ret;
+}
+
+void ShSDatenbank::unregisterKlient( int num, int sNum )
+{
+    Text *befehl = new Text( "DELETE FROM server_client WHERE client_id = " );
+    befehl->append( num );
+    befehl->append( " AND server_id = " );
+    befehl->append( sNum );
+    lock();
+    datenbank->befehl( befehl->getText() );
+    unlock();
+    befehl->release();
+}
+
+bool ShSDatenbank::setServerStatus( int id, int status )
+{
+    Text *befehl = new Text( "UPDATE server_shop SET server_status_id = " );
+    *befehl += status;
+    *befehl += "WHERE id = ";
+    *befehl += id;
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    bool ret = datenbank->getZeilenAnzahl() != 0;
+    unlock();
+    befehl->release();
+    return ret;
+}
+
+bool ShSDatenbank::setMaxKarten( int id, int maxK )
+{
+    Text *befehl = new Text( "UPDATE server SET max_tasks = " );
+    befehl->append( maxK );
+    befehl->append( " WHERE id = " );
+    befehl->append( id );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    bool ret = datenbank->getZeilenAnzahl() > 0;
+    unlock();
+    befehl->release();
+    return ret;
+}
+
+bool ShSDatenbank::serverIstNichtPausiert( int id )
+{
+    Text *befehl = new Text( "SELECT server_status_id FROM server WHERE id = " );
+    befehl->append( id );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    bool ret = (int)res.values[ 0 ] == 3;
+    res.destroy();
+    return ret;
+}
+
+bool ShSDatenbank::getSpielArtListe( int cId, char *suche, Array< int > *ret )
+{
+    Text *befehl = new Text( "SELECT distinct( a.id ) FROM spiel_art a LEFT JOIN account_client b ON b.client_id = " );
+    befehl->append( cId );
+    befehl->append( " LEFT JOIN spiel_art_account c ON a.id = c.spiel_art_id AND b.account_id = c.account_id AND "
+        "c.status_id = 2 AND c.end_dat IS NULL INNER JOIN spiel_art_kauf_erlaubt d ON d.spiel_art_id = a.id WHERE a.name LIKE '%" );
+    befehl->append( suche );
+    befehl->append( "%' AND c.spiel_art_id IS NULL" );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    ret->leeren();
+    for( int i = 0; i < res.zeilenAnzahl; i++ )
+        ret->add( TextZuInt( res.values[ i ].getText(), 10 ) );
+    res.destroy();
+    return 1;
+}
+
+int ShSDatenbank::getSpielBesitzStatus( int cId, int sId )
+{
+    Text *befehl = new Text( "SELECT b.status_id FROM account_client a, spiel_art_account b "
+        "WHERE a.account_id = b.account_id AND b.end_dat IS NULL AND a.client_id = " );
+    befehl->append( cId );
+    befehl->append( " AND b.spiel_art_id = " );
+    befehl->append( sId );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+    res.destroy();
+    return ret;
+}
+
+int ShSDatenbank::getSpielTestversionStatus( int cId, int sId )
+{
+    Text *befehl = new Text( "SELECT b.verbleibend FROM account_client a, spiel_art_account b "
+        "WHERE a.account_id = b.account_id AND b.end_dat IS NULL AND b.status_id = 1 AND a.client_id = " );
+    befehl->append( cId );
+    befehl->append( " AND b.spiel_art_id = " );
+    befehl->append( sId );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+    res.destroy();
+    return ret;
+}
+
+int ShSDatenbank::getSpielErwerbbarStatus( int cId, int sId )
+{
+    Text *befehl = new Text( "SELECT a.spiel_art_account_status_id FROM spiel_art_kauf_erlaubt a LEFT JOIN account_client b ON b.client_id = " );
+    befehl->append( cId );
+    befehl->append( " LEFT JOIN spiel_art_account c ON a.spiel_art_id = c.spiel_art_id AND b.account_id = c.account_id AND c.end_dat IS NULL "
+        "AND a.spiel_art_account_status_id = c.status_id WHERE c.spiel_art_id IS NULL AND a.spiel_art_id = " );
+    befehl->append( sId );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    int ret = 0;
+    for( int i = 0; i < res.zeilenAnzahl; i++ )
+    {
+        if( TextZuInt( res.values[ i ].getText(), 10 ) == 1 )
+            ret |= 1;
+        else if( TextZuInt( res.values[ i ].getText(), 10 ) == 2 )
+            ret |= 2;
+    }
+    res.destroy();
+    return ret;
+}
+
+int ShSDatenbank::getSpielPreis( int sId, bool testVersion )
+{
+    int status = testVersion ? 1 : 2;
+    Text *befehl = new Text( "SELECT kupfer FROM spiel_art_kauf_erlaubt WHERE spiel_art_id = " );
+    befehl->append( sId );
+    befehl->append( " AND spiel_art_account_status_id = " );
+    befehl->append( status );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+    res.destroy();
+    return ret;
+}
+
+bool ShSDatenbank::spielKaufen( int cId, int sId, bool testVersion )
+{
+    Text *befehl = new Text( "SELECT spiel_erwerben( " );
+    befehl->append( cId );
+    befehl->append( ", " );
+    befehl->append( sId );
+    if( testVersion )
+        befehl->append( ", TRUE )" );
+    else
+        befehl->append( ", FALSE )" );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    bool ret = res.values[ 0 ].istGleich( "t" );
+    res.destroy();
+    return ret;
+}
+
+bool ShSDatenbank::getKarteListe( int cId, int sId, char *suche, Array< int > *ret )
+{
+    Text *befehl = new Text( "SELECT distinct( a.id ) FROM karte a LEFT JOIN account_client b ON b.client_id = " );
+    befehl->append( cId );
+    befehl->append( " LEFT JOIN karte_account c ON a.id = c.karte_id AND b.account_id = c.account_id AND "
+        "c.status_id = 2 AND c.end_dat IS NULL INNER JOIN karte_kauf_erlaubt d ON d.karte_id = a.id WHERE a.name LIKE '%" );
+    Text s( suche );
+    s.ersetzen( "'", "''" );
+    befehl->append( (char*)s );
+    befehl->append( "%' AND c.karte_id IS NULL" );
+    if( sId )
+    {
+        befehl->append( " AND a.spiel_art_id = " );
+        befehl->append( sId );
+    }
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    ret->leeren();
+    for( int i = 0; i < res.zeilenAnzahl; i++ )
+        ret->add( TextZuInt( res.values[ i ].getText(), 10 ) );
+    res.destroy();
+    return 1;
+}
+
+int ShSDatenbank::getKarteBesitzStatus( int cId, int kId )
+{
+    Text *befehl = new Text( "SELECT b.status_id FROM account_client a, karte_account b "
+        "WHERE a.account_id = b.account_id AND b.end_dat IS NULL AND a.client_id = " );
+    befehl->append( cId );
+    befehl->append( " AND b.karte_id = " );
+    befehl->append( kId );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+    res.destroy();
+    return ret;
+}
+
+int ShSDatenbank::getKarteTestversionStatus( int cId, int kId )
+{
+    Text *befehl = new Text( "SELECT b.verbleibend FROM account_client a, karte_account b "
+        "WHERE a.account_id = b.account_id AND b.end_dat IS NULL AND b.status_id = 1 AND a.client_id = " );
+    befehl->append( cId );
+    befehl->append( " AND b.karte_id = " );
+    befehl->append( kId );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+    res.destroy();
+    return ret;
+}
+
+int ShSDatenbank::getKarteErwerbbarStatus( int cId, int kId )
+{
+    Text *befehl = new Text( "SELECT a.karte_account_status_id FROM karte_kauf_erlaubt a LEFT JOIN account_client b ON b.client_id = " );
+    befehl->append( cId );
+    befehl->append( " LEFT JOIN karte_account c ON a.karte_id = c.karte_id AND b.account_id = c.account_id AND c.end_dat IS NULL "
+        "AND a.karte_account_status_id = c.status_id WHERE c.karte_id IS NULL AND a.karte_id = " );
+    befehl->append( kId );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    int ret = 0;
+    for( int i = 0; i < res.zeilenAnzahl; i++ )
+    {
+        if( TextZuInt( res.values[ i ].getText(), 10 ) == 1 )
+            ret |= 1;
+        else if( TextZuInt( res.values[ i ].getText(), 10 ) == 2 )
+            ret |= 2;
+    }
+    res.destroy();
+    return ret;
+}
+
+int ShSDatenbank::getKartePreis( int kId, bool testVersion )
+{
+    int status = testVersion ? 1 : 2;
+    Text *befehl = new Text( "SELECT kupfer FROM karte_kauf_erlaubt WHERE karte_id = " );
+    befehl->append( kId );
+    befehl->append( " AND karte_account_status_id = " );
+    befehl->append( status );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+    res.destroy();
+    return ret;
+}
+
+bool ShSDatenbank::karteKaufen( int cId, int kId, bool testVersion )
+{
+    Text *befehl = new Text( "SELECT karte_erwerben( " );
+    befehl->append( cId );
+    befehl->append( ", " );
+    befehl->append( kId );
+    if( testVersion )
+        befehl->append( ", TRUE )" );
+    else
+        befehl->append( ", FALSE )" );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    bool ret = res.values[ 0 ].istGleich( "t" );
+    res.destroy();
+    return ret;
+}
+
+int ShSDatenbank::getUpdateKarte( int serverId )
+{
+    Text befehl = "SELECT a.id FROM karte a, karte_shop_update b WHERE b.karte_id = a.id AND a.server_shop_id = ";
+    befehl += serverId;
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    Result r = datenbank->getResult();
+    unlock();
+    if( r.zeilenAnzahl )
+    {
+        int karte = r.values[ 0 ];
+        r.destroy();
+        return karte;
+    }
+    r.destroy();
+    return 0;
+}
+
+bool ShSDatenbank::endUpdateKarte( int karteId )
+{
+    Text befehl = "SELECT karte_shop_update_ende( ";
+    befehl += karteId;
+    befehl += " )";
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    Result r = datenbank->getResult();
+    unlock();
+    if( !r.zeilenAnzahl )
+    {
+        r.destroy();
+        return 0;
+    }
+    bool ret = r.values[ 0 ].istGleich( "t" );
+    r.destroy();
+    return ret;
+}
+
+bool ShSDatenbank::getEditorServerPortIp( int karteId, int *port, Text *ip )
+{
+    if( !port || !ip )
+        return 0;
+    Text befehl = "SELECT a.port, a.ip FROM server a, karte b WHERE a.id = b.server_editor_id AND b.id = ";
+    befehl += karteId;
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    Result r = datenbank->getResult();
+    unlock();
+    if( !r.zeilenAnzahl )
+    {
+        r.destroy();
+        return 0;
+    }
+    *port = r.values[ 0 ];
+    ip->setText( r.values[ 1 ] );
+    r.destroy();
+    return 1;
+}
+
+bool ShSDatenbank::proveKarte( int serverId, int karteId )
+{
+    Text befehl = "SELECT id FROM karte WHERE id = ";
+    befehl += karteId;
+    befehl += " AND server_shop_id = ";
+    befehl += serverId;
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    int z = datenbank->getZeilenAnzahl();
+    unlock();
+    return z != 0;
+}
+
+bool ShSDatenbank::getKarteShopServerPortIp( int karteId, int clientId, int *port, Text *ip )
+{
+    if( !port || !ip )
+        return 0;
+    Text befehl = "SELECT a.id, a.port, a.ip FROM server a, karte b WHERE a.id = b.server_shop_id AND a.server_status_id = 3 AND b.id = ";
+    befehl += karteId;
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    Result r = datenbank->getResult();
+    unlock();
+    if( !r.zeilenAnzahl )
+    {
+        r.destroy();
+        return 0;
+    }
+    int id = r.values[ 0 ];
+    *port = r.values[ 1 ];
+    ip->setText( r.values[ 2 ] );
+    r.destroy();
+    befehl = "UPDATE server_client SET server_id = ";
+    befehl += id;
+    befehl += " WHERE client_id = ";
+    befehl += clientId;
+    befehl += " AND server_id = ";
+    befehl += sid;
+    lock();
+    datenbank->befehl( befehl );
+    unlock();
+    return 1;
+}
+
+bool ShSDatenbank::proveSpiel( int serverId, int spielId )
+{
+    Text befehl = "SELECT id FROM spiel_art WHERE id = ";
+    befehl += spielId;
+    befehl += " AND server_shop_id = ";
+    befehl += serverId;
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    int z = datenbank->getZeilenAnzahl();
+    unlock();
+    return z != 0;
+}
+
+bool ShSDatenbank::getSpielShopServerPortIp( int spielId, int clientId, int *port, Text *ip )
+{
+    if( !port || !ip )
+        return 0;
+    Text befehl = "SELECT a.id, a.port, a.ip FROM server a, spiel_art b WHERE a.id = b.server_shop_id AND a.server_status_id = 3 AND b.id = ";
+    befehl += spielId;
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    Result r = datenbank->getResult();
+    unlock();
+    if( !r.zeilenAnzahl )
+    {
+        r.destroy();
+        return 0;
+    }
+    int id = r.values[ 0 ];
+    *port = r.values[ 1 ];
+    ip->setText( r.values[ 2 ] );
+    r.destroy();
+    befehl = "UPDATE server_shop_clients SET server_id = ";
+    befehl += id;
+    befehl += " WHERE client_id = ";
+    befehl += clientId;
+    befehl += " AND server_id = ";
+    befehl += sid;
+    lock();
+    datenbank->befehl( befehl );
+    unlock();
+    return 1;
+}
+
+// constant
+Text *ShSDatenbank::getLetzterFehler() const
+{
+    return datenbank->getLetzterFehler();
+}
+
+// Reference Counting
+ShSDatenbank *ShSDatenbank::getThis()
+{
+    ref++;
+    return this;
+}
+
+ShSDatenbank *ShSDatenbank::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}

+ 70 - 0
ShopServer/Datenbank.h

@@ -0,0 +1,70 @@
+#ifndef Datenbank_H
+#define Datenbank_H
+
+#include <sql.h>
+#include <Text.h>
+#include <Array.h>
+#include <InitDatei.h>
+
+using namespace Framework;
+using namespace sql;
+
+namespace Admin_Recht
+{
+	const int ShSStarten = 37;
+	const int ShSBeenden = 38;
+	const int ShSPausieren = 39;
+    const int ShSMKChange = 40;
+}
+
+class ShSDatenbank
+{
+private:
+	Datenbank *datenbank;
+	CRITICAL_SECTION cs;
+    int sid;
+	int ref;
+
+public:
+	// Konstruktor
+	ShSDatenbank( InitDatei *zIni );
+	// Destruktor
+	~ShSDatenbank();
+	// nicht constant
+	void lock();
+	void unlock();
+	int istAdministrator( const char *name, const char *passwort );
+	bool adminHatRecht( int id, int recht );
+	bool proveKlient( int num, int sNum );
+	Text *getKlientKey( int cId );
+	void unregisterKlient( int num, int sNum );
+	bool setServerStatus( int id, int status );
+    bool setMaxKarten( int id, int maxK );
+	bool serverIstNichtPausiert( int id );
+	bool getSpielArtListe( int cId, char *suche, Array< int > *ret );
+	int getSpielBesitzStatus( int cId, int sId );
+	int getSpielTestversionStatus( int cId, int sId );
+	int getSpielErwerbbarStatus( int cId, int sId );
+	int getSpielPreis( int sId, bool testVersion );
+	bool spielKaufen( int cId, int sId, bool testVersion );
+	bool getKarteListe( int cId, int sId, char *suche, Array< int > *ret );
+	int getKarteBesitzStatus( int cId, int kId );
+	int getKarteTestversionStatus( int cId, int kId );
+	int getKarteErwerbbarStatus( int cId, int kId );
+	int getKartePreis( int kId, bool testVersion );
+    bool karteKaufen( int cId, int kId, bool testVersion );
+    int getUpdateKarte( int serverId );
+    bool endUpdateKarte( int karteId );
+    bool getEditorServerPortIp( int karteId, int *port, Text *ip );
+    bool proveKarte( int serverId, int karteId );
+    bool getKarteShopServerPortIp( int karteId, int clientId, int *port, Text *ip );
+    bool proveSpiel( int serverId, int spielId );
+    bool getSpielShopServerPortIp( int spielId, int clientId, int *port, Text *ip );
+	// constant
+	Text *getLetzterFehler() const;
+	// Reference Counting
+	ShSDatenbank *getThis();
+	ShSDatenbank *release();
+};
+
+#endif

+ 1220 - 0
ShopServer/ShopServer.cpp

@@ -0,0 +1,1220 @@
+#include "ShopServer.h"
+#include <iostream>
+#include <Klient.h>
+#include <Globals.h>
+
+// Inhalt der ShopServer Klasse aus ShopServer.h
+// Konstruktor 
+ShopServer::ShopServer( InitDatei *zIni )
+    : Thread()
+{
+    Network::Start( 100 );
+    std::cout << "IS: Verbindung mit Datenbank wird hergestellt...\n";
+    db = new ShSDatenbank( zIni );
+    klientAnzahl = 0;
+    klients = new RCArray< ShSKlient >();
+    empfangen = 0;
+    gesendet = 0;
+    fehler = new Text();
+    ini = zIni->getThis();
+    id = *zIni->zWert( "ServerId" );
+    server = new Server();
+    aServer = new Server();
+    std::cout << "IS: Starten des Admin Servers...\n";
+    if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
+    {
+        std::cout << "ShS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
+        exit( 1 );
+    }
+    db->setServerStatus( id, 2 );
+    end = 0;
+    nichtPausiert = 0;
+    InitializeCriticalSection( &cs );
+    ref = 1;
+    if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
+    {
+        serverStarten();
+        serverFortsetzen();
+    }
+    updater = new Updater( getThis() );
+}
+
+// Destruktor 
+ShopServer::~ShopServer()
+{
+    updater->release();
+    fehler->release();
+    server->trenne();
+    server->release();
+    aServer->trenne();
+    aServer->release();
+    if( klients )
+        klients->release();
+    ini->release();
+    db->release();
+    DeleteCriticalSection( &cs );
+}
+
+// nicht constant 
+void ShopServer::runn()
+{
+    while( !end )
+    {
+        SKlient *klient;
+        klient = aServer->getKlient();
+        if( end && klient )
+        {
+            klient->trenne();
+            klient = klient->release();
+            Sleep( 1000 );
+            return;
+        }
+        if( !klient )
+            return;
+        ShSAKlient *clHandle = new ShSAKlient( klient, getThis() );
+        clHandle->start();
+    }
+}
+
+void ShopServer::thread()
+{
+    while( 1 )
+    {
+        SKlient *klient;
+        klient = server->getKlient();
+        if( !klient )
+            break;
+		Framework::getThreadRegister()->cleanUpClosedThreads();
+        ShSKlient *clHandle = new ShSKlient( klient, getThis() );
+        EnterCriticalSection( &cs );
+        klients->set( clHandle, klientAnzahl );
+        klientAnzahl++;
+        LeaveCriticalSection( &cs );
+        clHandle->start();
+    }
+}
+
+void ShopServer::close()
+{
+    db->setServerStatus( id, 1 );
+    server->trenne();
+#ifdef WIN32
+    warteAufThread( 1000 );
+#endif
+    EnterCriticalSection( &cs );
+    for( int i = 0; i < klientAnzahl; i++ )
+        klients->z( i )->absturz();
+    klients = klients->release();
+    klientAnzahl = 0;
+    LeaveCriticalSection( &cs );
+    ende();
+    run = 0;
+    end = 1;
+    Klient *klient = new Klient();
+    klient->verbinde( aServer->getPort(), "127.0.0.1" );
+    Sleep( 500 );
+    aServer->trenne();
+    klient->release();
+}
+
+bool ShopServer::serverStarten()
+{
+    if( nichtPausiert )
+    {
+        fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
+        return 0;
+    }
+    if( server )
+        server->release();
+    server = new Server();
+    if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
+    {
+        nichtPausiert = 1;
+        start();
+        return 1;
+    }
+    else
+    {
+        serverBeenden();
+        fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
+        return 0;
+    }
+}
+
+bool ShopServer::serverPause()
+{
+    if( !nichtPausiert )
+    {
+        fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
+        return 0;
+    }
+    if( !db->setServerStatus( id, 2 ) )
+    {
+        fehler->setText( "Der Server konnte nicht pausiert werden: " );
+        fehler->append( db->getLetzterFehler() );
+        return 0;
+    }
+    return 1;
+}
+
+bool ShopServer::serverFortsetzen()
+{
+    if( !nichtPausiert )
+    {
+        fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
+        return 0;
+    }
+    if( !db->setServerStatus( id, 3 ) )
+    {
+        fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
+        fehler->append( db->getLetzterFehler() );
+        return 0;
+    }
+    return 1;
+}
+
+bool ShopServer::serverBeenden()
+{
+    if( !nichtPausiert )
+    {
+        fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
+        return 0;
+    }
+    if( db->serverIstNichtPausiert( id ) )
+    {
+        fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
+        return 0;
+    }
+    nichtPausiert = 0;
+    ende();
+    if( server )
+        server->trenne();
+    return 1;
+}
+
+bool ShopServer::setMaxKarten( int mk )
+{
+    if( !db->setMaxKarten( id, mk ) )
+    {
+        fehler->setText( "Die maximale Anzahl der Karten konnte nicht gesetzt werden:\n" );
+        fehler->append( db->getLetzterFehler() );
+        return 0;
+    }
+    ini->setWert( "MaxKarten", Text() += mk );
+    return 1;
+}
+
+bool ShopServer::absturzKlient( int klientId )
+{
+    bool gefunden = 0;
+    EnterCriticalSection( &cs );
+    for( int i = 0; i < klientAnzahl; i++ )
+    {
+        if( klients->z( i )->getKlientNummer() == klientId )
+        {
+            klients->z( i )->absturz();
+            klients->remove( i );
+            klientAnzahl--;
+            gefunden = 1;
+            break;
+        }
+    }
+    LeaveCriticalSection( &cs );
+    return gefunden;
+}
+
+bool ShopServer::removeKlient( ShSKlient *zKlient )
+{
+    bool gefunden = 0;
+    EnterCriticalSection( &cs );
+    for( int i = 0; i < klientAnzahl; i++ )
+    {
+        if( klients->z( i ) == zKlient )
+        {
+            klients->remove( i );
+            klientAnzahl--;
+            gefunden = 1;
+            break;
+        }
+    }
+    LeaveCriticalSection( &cs );
+    return gefunden;
+}
+
+void ShopServer::addGesendet( int bytes )
+{
+    gesendet += bytes;
+}
+
+void ShopServer::addEmpfangen( int bytes )
+{
+    empfangen += bytes;
+}
+
+// constant 
+bool ShopServer::istAn() const
+{
+    return db->serverIstNichtPausiert( id );
+}
+
+Server *ShopServer::zServer() const
+{
+    return server;
+}
+
+ShSDatenbank *ShopServer::zDB() const
+{
+    return db;
+}
+
+bool ShopServer::hatClients() const
+{
+    return klientAnzahl > 0;
+}
+
+InitDatei *ShopServer::zInit() const
+{
+    return ini;
+}
+
+int ShopServer::getId() const
+{
+    return id;
+}
+
+char *ShopServer::getLetzterFehler() const
+{
+    return fehler->getText();
+}
+
+// Reference Counting
+ShopServer *ShopServer::getThis()
+{
+    ref++;
+    return this;
+}
+
+ShopServer *ShopServer::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}
+
+
+// Inhalt der ShSAKlient Klasse aus ShopServer.h
+// Konstruktor 
+ShSAKlient::ShSAKlient( SKlient *klient, ShopServer *shs )
+    : Thread()
+{
+    this->klient = klient;
+    unsigned char key[ 20 ] = { 86, 90, 94, 69, 141, 246, 13, 206, 83, 174, 74, 243, 59, 156, 8, 202, 134, 62, 56, 11 };
+    klient->setSendeKey( (char*)key, 20 );
+    klient->setEmpfangKey( (char*)key, 20 );
+    name = new Text( "" );
+    passwort = new Text( "" );
+    adminId = 0;
+    this->shs = shs;
+}
+
+// Destruktor 
+ShSAKlient::~ShSAKlient()
+{
+    klient->trenne();
+    klient->release();
+    shs->release();
+    name->release();
+    passwort->release();
+}
+
+// nicht constant 
+void ShSAKlient::thread()
+{
+    while( 1 )
+    {
+        char c = 0;
+        if( !klient->getNachrichtEncrypted( &c, 1 ) )
+            break;
+        else
+        {
+            bool br = 0;
+            switch( c )
+            {
+            case 1: // Login
+                if( 1 )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    char nLen = 0;
+                    klient->getNachrichtEncrypted( &nLen, 1 );
+                    char *n = new char[ nLen + 1 ];
+                    n[ (int)nLen ] = 0;
+                    if( nLen )
+                        klient->getNachrichtEncrypted( n, nLen );
+                    char pLen = 0;
+                    klient->getNachrichtEncrypted( &pLen, 1 );
+                    char *p = new char[ pLen + 1 ];
+                    p[ (int)pLen ] = 0;
+                    if( pLen )
+                        klient->getNachrichtEncrypted( p, pLen );
+                    int adminId = shs->zDB()->istAdministrator( n, p );
+                    if( adminId )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        name->setText( n );
+                        passwort->setText( p );
+                        this->adminId = adminId;
+                    }
+                    else
+                        errorZuKlient( "Falsche Kombination aus Name und Passwort." );
+                    delete[] n;
+                    delete[] p;
+                }
+                break;
+            case 2: // Logout
+                adminId = 0;
+                name->setText( "" );
+                passwort->setText( "" );
+                klient->sendeEncrypted( "\1", 1 );
+                break;
+            case 3: // Trennen
+                br = 1;
+                klient->sendeEncrypted( "\1", 1 );
+                break;
+            case 4: // Server starten
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( shs->zDB()->adminHatRecht( adminId, Admin_Recht::ShSStarten ) )
+                    {
+                        if( !shs->serverStarten() )
+                        {
+                            Text *err = new Text();
+                            err->append( shs->getLetzterFehler() );
+                            errorZuKlient( err->getText() );
+                            err->release();
+                        }
+                        else
+                            klient->sendeEncrypted( "\1", 1 );
+                    }
+                    else
+                        errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
+                }
+                break;
+            case 5: // Server beenden
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( shs->zDB()->adminHatRecht( adminId, Admin_Recht::ShSBeenden ) )
+                    {
+                        if( shs->serverBeenden() )
+                            klient->sendeEncrypted( "\1", 1 );
+                        else
+                        {
+                            Text *err = new Text();
+                            err->append( shs->getLetzterFehler() );
+                            errorZuKlient( err->getText() );
+                            err->release();
+                        }
+                    }
+                    else
+                        errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
+                }
+                break;
+            case 6: // Programm Schließen
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    bool ok = 0;
+                    if( shs->isRunning() )
+                    {
+                        if( shs->zDB()->adminHatRecht( adminId, Admin_Recht::ShSBeenden ) )
+                        {
+                            if( shs->serverBeenden() )
+                                ok = 1;
+                            else
+                            {
+                                Text *err = new Text();
+                                err->append( shs->getLetzterFehler() );
+                                errorZuKlient( err->getText() );
+                                err->release();
+                            }
+                        }
+                        else
+                            errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
+                    }
+                    else
+                        ok = 1;
+                    if( ok && shs->hatClients() )
+                    {
+                        errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
+                        break;
+                    }
+                    if( ok )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        std::cout << "ShS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
+                        shs->close();
+                        br = 1;
+                    }
+                }
+                break;
+            case 7: // Programm abstürzen
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    bool ok = 0;
+                    if( shs->isRunning() )
+                    {
+                        if( shs->zDB()->adminHatRecht( adminId, Admin_Recht::ShSBeenden ) )
+                        {
+                            shs->serverBeenden();
+                            ok = 1;
+                        }
+                        else
+                            errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
+                    }
+                    else
+                        ok = 1;
+                    if( ok )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        std::cout << "ShS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
+                        shs->close();
+                        br = 1;
+                    }
+                }
+                break;
+            case 8: // Status Frage
+                if( 1 )
+                {
+                    char status = 0;
+                    if( shs->isRunning() )
+                    {
+                        status = 1;
+                        if( shs->istAn() )
+                            status = 2;
+                    }
+                    klient->sendeEncrypted( "\1", 1 );
+                    klient->sendeEncrypted( &status, 1 );
+                }
+                break;
+            case 9: // Server pausieren
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    char pause = 0;
+                    klient->getNachrichtEncrypted( &pause, 1 );
+                    if( shs->zDB()->adminHatRecht( adminId, Admin_Recht::ShSPausieren ) )
+                    {
+                        bool ok = 0;
+                        if( pause )
+                            ok = shs->serverPause();
+                        else
+                            ok = shs->serverFortsetzen();
+                        if( ok )
+                            klient->sendeEncrypted( "\1", 1 );
+                        else
+                        {
+                            Text *err = new Text();
+                            err->append( shs->getLetzterFehler() );
+                            errorZuKlient( err->getText() );
+                            err->release();
+                        }
+                    }
+                    else
+                    {
+                        if( pause )
+                            errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
+                        else
+                            errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
+                    }
+                }
+                break;
+            case 0xB: // maximale Anzahl der Karten setzen
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int maxK = 0;
+                    klient->getNachrichtEncrypted( (char*)&maxK, 4 );
+                    if( shs->zDB()->adminHatRecht( adminId, Admin_Recht::ShSMKChange ) )
+                    {
+                        if( shs->setMaxKarten( maxK ) )
+                            klient->sendeEncrypted( "\1", 1 );
+                        else
+                        {
+                            Text *err = new Text();
+                            err->append( shs->getLetzterFehler() );
+                            errorZuKlient( err->getText() );
+                            err->release();
+                        }
+                    }
+                    else
+                        errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Karten zu verändern." );
+                }
+                break;
+            case 0xC: // klient absturtz
+                if( 1 )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int klientId = 0;
+                    klient->getNachrichtEncrypted( (char*)&klientId, 4 );
+                    if( klientId && shs->absturzKlient( klientId ) )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sendeEncrypted( "\0", 1 );
+                }
+                break;
+            default:
+                errorZuKlient( "Unbekannte Nachricht!" );
+                break;
+            }
+            if( br )
+                break;
+            shs->addEmpfangen( klient->getDownloadBytes( 1 ) );
+            shs->addGesendet( klient->getUploadBytes( 1 ) );
+        }
+    }
+    shs->addEmpfangen( klient->getDownloadBytes( 1 ) );
+    shs->addGesendet( klient->getUploadBytes( 1 ) );
+    delete this;
+}
+
+void ShSAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
+{
+    klient->sendeEncrypted( "\3", 1 );
+    char len = (char)textLength( nachricht );
+    klient->sendeEncrypted( &len, 1 );
+    klient->sendeEncrypted( nachricht, len );
+}
+
+
+// Inhalt der ShSKlient aus ShopServer.h
+// Konstruktor 
+ShSKlient::ShSKlient( SKlient *klient, ShopServer *shs )
+    : Thread()
+{
+    this->klient = klient;
+    unsigned char key[ 20 ] = { 218, 226, 231, 216, 68, 63, 132, 155, 49, 235, 239, 0, 19, 23, 116, 244, 235, 21, 189, 53 };
+    klient->setSendeKey( (char*)key, 20 );
+    klient->setEmpfangKey( (char*)key, 20 );
+    klientNummer = 0;
+    this->shs = shs;
+    ref = 1;
+}
+
+// Destruktor 
+ShSKlient::~ShSKlient()
+{
+    klient->release();
+    shs->release();
+}
+
+// nicht constant
+void ShSKlient::absturz()
+{
+    ende();
+    klient->trenne();
+    shs->zDB()->unregisterKlient( klientNummer, shs->getId() );
+}
+
+void ShSKlient::thread()
+{
+    while( 1 )
+    {
+        char c = 0;
+        if( !klient->getNachrichtEncrypted( &c, 1 ) )
+            break;
+        else
+        {
+            bool br = 0;
+            switch( c )
+            {
+            case 1: // Klient identifikation
+                klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
+                if( !shs->zDB()->proveKlient( klientNummer, shs->getId() ) )
+                {
+                    klientNummer = 0;
+                    errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
+                }
+                else
+                {
+                    Text *key = shs->zDB()->getKlientKey( klientNummer );
+                    if( !key )
+                        errorZuKlient( "Es konnte kein Key ermittelt werden." );
+                    else
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        klient->setEmpfangKey( *key, key->getLength() );
+                        klient->setSendeKey( *key, key->getLength() );
+                        key->release();
+                    }
+                }
+                break;
+            case 2: // Main / Erhaltung Server message
+                if( 1 )
+                {
+                    char befehl = 0;
+                    klient->getNachrichtEncrypted( &befehl, 1 );
+                    switch( befehl )
+                    {
+                    case 2: // klient absturtz
+                        if( 1 )
+                        {
+                            int klientId = 0;
+                            klient->getNachrichtEncrypted( (char*)&klientId, 4 );
+                            if( klientId && shs->absturzKlient( klientId ) )
+                                klient->sendeEncrypted( "\1", 1 );
+                            else
+                                klient->sendeEncrypted( "\0", 1 );
+                        }
+                        break;
+                    default:
+                        errorZuKlient( "Befehl nicht bekannt!" );
+                        break;
+                    }
+                }
+                break;
+            case 3: // Verbindungsende
+                br = 1;
+                klient->sendeEncrypted( "\1", 1 );
+                break;
+            case 4: // unregister Klient
+                if( !klientNummer )
+                {
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                    break;
+                }
+                shs->zDB()->unregisterKlient( klientNummer, shs->getId() );
+                klient->sendeEncrypted( "\1", 1 );
+                break;
+            case 5: // nach Spielen suchen
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    char len = 0;
+                    klient->getNachrichtEncrypted( &len, 1 );
+                    char *suche = new char[ len + 1 ];
+                    suche[ (int)len ] = 0;
+                    if( len )
+                        klient->getNachrichtEncrypted( suche, len );
+                    Array< int > *list = new Array< int >();
+                    if( shs->zDB()->getSpielArtListe( klientNummer, suche, list ) )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        int anz = list->getEintragAnzahl();
+                        klient->sendeEncrypted( (char*)&anz, 4 );
+                        if( anz )
+                        {
+                            for( int i = 0; i < anz; i++ )
+                            {
+                                int w = list->get( i );
+                                klient->sendeEncrypted( (char*)&w, 4 );
+                            }
+                        }
+                    }
+                    else
+                        errorZuKlient( "Bei der Suche ist ein Fehler aufgetreten." );
+                    list->release();
+                    delete[] suche;
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 6: // frage nach Spiel Titelbild
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int spielId = 0;
+                    klient->getNachrichtEncrypted( (char*)&spielId, 4 );
+                    if( !shs->zDB()->proveSpiel( shs->getId(), spielId ) )
+                    {
+                        Text ip = "";
+                        int port = 0;
+                        if( !shs->zDB()->getSpielShopServerPortIp( spielId, klientNummer, &port, &ip ) )
+                            errorZuKlient( "Dieses Spiel ist momentan nicht erreichbar. Bitte versuche es später erneut." );
+                        else
+                        {
+                            klient->sendeEncrypted( "\2", 1 );
+                            klient->sendeEncrypted( (char*)&port, 4 );
+                            char len = (char)ip.getLength();
+                            klient->sendeEncrypted( &len, 1 );
+                            klient->sendeEncrypted( ip.getText(), len );
+                            br = 1;
+                            break;
+                        }
+                    }
+                    Text *pfad = new Text( shs->zInit()->zWert( "ShopSeitenPfad" )->getText() );
+                    pfad->append( "/spiele/" );
+                    pfad->append( spielId );
+                    pfad->append( "/titelbg.ltdb" );
+                    if( !DateiExistiert( pfad->getText() ) )
+                    {
+                        errorZuKlient( "Das Spiel ist nicht vorhanden." );
+                        pfad->release();
+                        break;
+                    }
+                    klient->sendeEncrypted( "\1", 1 );
+                    Datei *dat = new Datei();
+                    dat->setDatei( pfad );
+                    dat->open( Datei::Style::lesen );
+                    __int64 gr = dat->getSize();
+                    klient->sendeEncrypted( (char*)&gr, 8 );
+                    char *bytes = new char[ 2048 ];
+                    while( gr > 0 )
+                    {
+                        int len = gr > 2048 ? 2048 : (int)gr;
+                        dat->lese( bytes, len );
+                        klient->sende( bytes, len );
+                        gr -= len;
+                    }
+                    dat->close();
+                    dat->release();
+                    delete[] bytes;
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 7: // frage nach Spiel Seite
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int spielId = 0;
+                    klient->getNachrichtEncrypted( (char*)&spielId, 4 );
+                    if( !shs->zDB()->proveSpiel( shs->getId(), spielId ) )
+                    {
+                        Text ip = "";
+                        int port = 0;
+                        if( !shs->zDB()->getSpielShopServerPortIp( spielId, klientNummer, &port, &ip ) )
+                            errorZuKlient( "Dieses Spiel ist momentan nicht erreichbar. Bitte versuche es später erneut." );
+                        else
+                        {
+                            klient->sendeEncrypted( "\2", 1 );
+                            klient->sendeEncrypted( (char*)&port, 4 );
+                            char len = (char)ip.getLength();
+                            klient->sendeEncrypted( &len, 1 );
+                            klient->sendeEncrypted( ip.getText(), len );
+                            br = 1;
+                            break;
+                        }
+                    }
+                    Text *pfad = new Text( shs->zInit()->zWert( "ShopSeitenPfad" )->getText() );
+                    pfad->append( "/spiele/" );
+                    pfad->append( spielId );
+                    pfad->append( "/seite" );
+                    if( !DateiExistiert( pfad->getText() ) )
+                    {
+                        errorZuKlient( "Das Spiel ist nicht vorhanden." );
+                        pfad->release();
+                        break;
+                    }
+                    klient->sendeEncrypted( "\1", 1 );
+                    Datei *dat = new Datei();
+                    dat->setDatei( pfad );
+                    RCArray< Text > *list = dat->getDateiListe();
+                    int dAnz = list->getEintragAnzahl();
+                    for( int i = 0; i < dAnz; i++ )
+                    {
+                        if( DateiIstVerzeichnis( list->get( i ) ) || list->z( i )->istGleich( "." ) || list->z( i )->istGleich( ".." ) )
+                        {
+                            list->remove( i );
+                            dAnz--;
+                            i--;
+                        }
+                    }
+                    klient->sendeEncrypted( (char*)&dAnz, 4 );
+                    for( int i = 0; i < dAnz; i++ )
+                    {
+                        Text *pf = new Text( dat->zPfad()->getText() );
+                        pf->append( "/" );
+                        pf->append( list->z( i )->getText() );
+                        Datei *d = new Datei();
+                        d->setDatei( pf );
+                        d->open( Datei::Style::lesen );
+                        char nl = (char)list->z( i )->getLength();
+                        klient->sendeEncrypted( &nl, 1 );
+                        klient->sendeEncrypted( list->z( i )->getText(), nl );
+                        __int64 gr = d->getSize();
+                        klient->sendeEncrypted( (char*)&gr, 8 );
+                        char *bytes = new char[ 2048 ];
+                        while( gr > 0 )
+                        {
+                            int len = gr > 2048 ? 2048 : (int)gr;
+                            d->lese( bytes, len );
+                            klient->sende( bytes, len );
+                            gr -= len;
+                        }
+                        delete[] bytes;
+                        d->close();
+                        d->release();
+                    }
+                    list->release();
+                    dat->release();
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 8: // frage nach Spiel Besitz Status
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int spielId = 0;
+                    klient->getNachrichtEncrypted( (char*)&spielId, 4 );
+                    int status = shs->zDB()->getSpielBesitzStatus( klientNummer, spielId );
+                    klient->sendeEncrypted( (char*)&status, 4 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 9: // frage nach Spiel Testversion Status
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int spielId = 0;
+                    klient->getNachrichtEncrypted( (char*)&spielId, 4 );
+                    int status = shs->zDB()->getSpielTestversionStatus( klientNummer, spielId );
+                    klient->sendeEncrypted( (char*)&status, 4 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0xA: // frage, ob Spiel erwerbbar ist
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int spielId = 0;
+                    klient->getNachrichtEncrypted( (char*)&spielId, 4 );
+                    int status = shs->zDB()->getSpielErwerbbarStatus( klientNummer, spielId );
+                    klient->sendeEncrypted( (char*)&status, 4 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0xB: // frage nach Spiel Preis
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int spielId = 0;
+                    klient->getNachrichtEncrypted( (char*)&spielId, 4 );
+                    char testVersion = 0;
+                    klient->getNachrichtEncrypted( &testVersion, 1 );
+                    int status = shs->zDB()->getSpielPreis( spielId, testVersion == 1 );
+                    klient->sendeEncrypted( (char*)&status, 4 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0xC: // Spiel kaufen
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int spielId = 0;
+                    klient->getNachrichtEncrypted( (char*)&spielId, 4 );
+                    char testVersion = 0;
+                    klient->getNachrichtEncrypted( &testVersion, 1 );
+                    bool ok = shs->zDB()->spielKaufen( klientNummer, spielId, testVersion == 1 );
+                    if( ok )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        errorZuKlient( "Das Spiel konnte nicht erworben werden." );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0xD: // nach Karten suchen
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int spielId = 0;
+                    klient->getNachrichtEncrypted( (char*)&spielId, 4 );
+                    char len = 0;
+                    klient->getNachrichtEncrypted( &len, 1 );
+                    char *suche = new char[ len + 1 ];
+                    suche[ (int)len ] = 0;
+                    if( len )
+                        klient->getNachrichtEncrypted( suche, len );
+                    Array< int > *list = new Array< int >();
+                    if( shs->zDB()->getKarteListe( klientNummer, spielId, suche, list ) )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        int anz = list->getEintragAnzahl();
+                        klient->sendeEncrypted( (char*)&anz, 4 );
+                        if( anz )
+                        {
+                            for( int i = 0; i < anz; i++ )
+                            {
+                                int w = list->get( i );
+                                klient->sendeEncrypted( (char*)&w, 4 );
+                            }
+                        }
+                    }
+                    else
+                        errorZuKlient( "Bei der Suche ist ein Fehler aufgetreten." );
+                    list->release();
+                    delete[] suche;
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0xE: // frage nach Karte Titelbild
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int karteId = 0;
+                    klient->getNachrichtEncrypted( (char*)&karteId, 4 );
+                    if( !shs->zDB()->proveKarte( shs->getId(), karteId ) )
+                    {
+                        Text ip = "";
+                        int port = 0;
+                        if( !shs->zDB()->getKarteShopServerPortIp( karteId, klientNummer, &port, &ip ) )
+                            errorZuKlient( "Diese Karte ist momentan nicht erreichbar. Bitte versuche es später erneut." );
+                        else
+                        {
+                            klient->sendeEncrypted( "\2", 1 );
+                            klient->sendeEncrypted( (char*)&port, 4 );
+                            char len = (char)ip.getLength();
+                            klient->sendeEncrypted( &len, 1 );
+                            klient->sendeEncrypted( ip.getText(), len );
+                            br = 1;
+                            break;
+                        }
+                    }
+                    Text *pfad = new Text( shs->zInit()->zWert( "ShopSeitenPfad" )->getText() );
+                    pfad->append( "/karten/" );
+                    pfad->append( karteId );
+                    pfad->append( "/titelbg.ltdb" );
+                    if( !DateiExistiert( pfad->getText() ) )
+                    {
+                        errorZuKlient( "Das Spiel ist nicht vorhanden." );
+                        pfad->release();
+                        break;
+                    }
+                    klient->sendeEncrypted( "\1", 1 );
+                    Datei *dat = new Datei();
+                    dat->setDatei( pfad );
+                    dat->open( Datei::Style::lesen );
+                    __int64 gr = dat->getSize();
+                    klient->sendeEncrypted( (char*)&gr, 8 );
+                    char *bytes = new char[ 2048 ];
+                    while( gr > 0 )
+                    {
+                        int len = gr > 2048 ? 2048 : (int)gr;
+                        dat->lese( bytes, len );
+                        klient->sende( bytes, len );
+                        gr -= len;
+                    }
+                    dat->close();
+                    dat->release();
+                    delete[] bytes;
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0xF: // frage nach Karte Seite
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int karteId = 0;
+                    klient->getNachrichtEncrypted( (char*)&karteId, 4 );
+                    if( !shs->zDB()->proveKarte( shs->getId(), karteId ) )
+                    {
+                        Text ip = "";
+                        int port = 0;
+                        if( !shs->zDB()->getKarteShopServerPortIp( karteId, klientNummer, &port, &ip ) )
+                            errorZuKlient( "Diese Karte ist momentan nicht erreichbar. Bitte versuche es später erneut." );
+                        else
+                        {
+                            klient->sendeEncrypted( "\2", 1 );
+                            klient->sendeEncrypted( (char*)&port, 4 );
+                            char len = (char)ip.getLength();
+                            klient->sendeEncrypted( &len, 1 );
+                            klient->sendeEncrypted( ip.getText(), len );
+                            br = 1;
+                            break;
+                        }
+                    }
+                    Text *pfad = new Text( shs->zInit()->zWert( "ShopSeitenPfad" )->getText() );
+                    pfad->append( "/karten/" );
+                    pfad->append( karteId );
+                    pfad->append( "/seite" );
+                    if( !DateiExistiert( pfad->getText() ) )
+                    {
+                        errorZuKlient( "Das Spiel ist nicht vorhanden." );
+                        pfad->release();
+                        break;
+                    }
+                    klient->sendeEncrypted( "\1", 1 );
+                    Datei *dat = new Datei();
+                    dat->setDatei( pfad );
+                    RCArray< Text > *list = dat->getDateiListe();
+                    int dAnz = list->getEintragAnzahl();
+                    for( int i = 0; i < dAnz; i++ )
+                    {
+                        if( DateiIstVerzeichnis( list->get( i ) ) || list->z( i )->istGleich( "." ) || list->z( i )->istGleich( ".." ) )
+                        {
+                            list->remove( i );
+                            dAnz--;
+                            i--;
+                        }
+                    }
+                    klient->sendeEncrypted( (char*)&dAnz, 4 );
+                    for( int i = 0; i < dAnz; i++ )
+                    {
+                        Text *pf = new Text( dat->zPfad()->getText() );
+                        pf->append( "/" );
+                        pf->append( list->z( i )->getText() );
+                        Datei *d = new Datei();
+                        d->setDatei( pf );
+                        d->open( Datei::Style::lesen );
+                        char nl = (char)list->z( i )->getLength();
+                        klient->sendeEncrypted( &nl, 1 );
+                        klient->sendeEncrypted( list->z( i )->getText(), nl );
+                        __int64 gr = d->getSize();
+                        klient->sendeEncrypted( (char*)&gr, 8 );
+                        char *bytes = new char[ 2048 ];
+                        while( gr > 0 )
+                        {
+                            int len = gr > 2048 ? 2048 : (int)gr;
+                            d->lese( bytes, len );
+                            klient->sende( bytes, len );
+                            gr -= len;
+                        }
+                        delete[] bytes;
+                        d->close();
+                        d->release();
+                    }
+                    list->release();
+                    dat->release();
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0x10: // frage nach Karte Besitz Status
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int karteId = 0;
+                    klient->getNachrichtEncrypted( (char*)&karteId, 4 );
+                    int status = shs->zDB()->getKarteBesitzStatus( klientNummer, karteId );
+                    klient->sendeEncrypted( (char*)&status, 4 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0x11: // frage nach Karte Testversion Status
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int karteId = 0;
+                    klient->getNachrichtEncrypted( (char*)&karteId, 4 );
+                    int status = shs->zDB()->getKarteTestversionStatus( klientNummer, karteId );
+                    klient->sendeEncrypted( (char*)&status, 4 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0x12: // frage, ob Karte erwerbbar ist
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int karteId = 0;
+                    klient->getNachrichtEncrypted( (char*)&karteId, 4 );
+                    int status = shs->zDB()->getKarteErwerbbarStatus( klientNummer, karteId );
+                    klient->sendeEncrypted( (char*)&status, 4 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0x13: // frage nach Karte Preis
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int karteId = 0;
+                    klient->getNachrichtEncrypted( (char*)&karteId, 4 );
+                    char testVersion = 0;
+                    klient->getNachrichtEncrypted( &testVersion, 1 );
+                    int status = shs->zDB()->getKartePreis( karteId, testVersion == 1 );
+                    klient->sendeEncrypted( (char*)&status, 4 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0x14: // Karte kaufen
+                if( klientNummer )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int karteId = 0;
+                    klient->getNachrichtEncrypted( (char*)&karteId, 4 );
+                    char testVersion = 0;
+                    klient->getNachrichtEncrypted( &testVersion, 1 );
+                    bool ok = shs->zDB()->karteKaufen( klientNummer, karteId, testVersion == 1 );
+                    if( ok )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        errorZuKlient( "Das Spiel konnte nicht erworben werden." );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 0x15: // ping
+                if( 1 )
+                {
+                    if( !klientNummer )
+                    {
+                        errorZuKlient( "Du bist nicht Identifiziert." );
+                        break;
+                    }
+                    klient->sendeEncrypted( "\1", 1 );
+                }
+                break;
+            default:
+                errorZuKlient( "Unbekannte Nachricht!" );
+                break;
+            }
+            if( br )
+                break;
+            shs->addEmpfangen( klient->getDownloadBytes( 1 ) );
+            shs->addGesendet( klient->getUploadBytes( 1 ) );
+        }
+    }
+    shs->addEmpfangen( klient->getDownloadBytes( 1 ) );
+    shs->addGesendet( klient->getUploadBytes( 1 ) );
+    shs->removeKlient( this ); // delete this
+}
+
+// constant
+void ShSKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
+{
+    klient->sendeEncrypted( "\3", 1 );
+    char len = (char)textLength( nachricht );
+    klient->sendeEncrypted( &len, 1 );
+    klient->sendeEncrypted( nachricht, len );
+}
+
+int ShSKlient::getKlientNummer() const // gibt die KlientId zurück
+{
+    return klientNummer;
+}
+
+// Reference Counting
+ShSKlient *ShSKlient::getThis()
+{
+    ref++;
+    return this;
+}
+
+ShSKlient *ShSKlient::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}

+ 110 - 0
ShopServer/ShopServer.h

@@ -0,0 +1,110 @@
+#ifndef ShopServer_H
+#define ShopServer_H
+
+#include <Server.h>
+#include <Thread.h>
+#include <Datei.h>
+#include <Text.h>
+#include <InitDatei.h>
+#include "Datenbank.h"
+#include "Updater.h"
+
+using namespace Framework;
+using namespace Network;
+
+class ShSKlient;
+
+class ShopServer : public Thread
+{
+private:
+	Server *server;
+	Server *aServer;
+	InitDatei *ini;
+	ShSDatenbank *db;
+	CRITICAL_SECTION cs;
+	RCArray< ShSKlient > *klients;
+    Text *fehler;
+    Updater *updater;
+	int klientAnzahl;
+	int id;
+	bool nichtPausiert;
+	int empfangen;
+	int gesendet;
+	bool end;
+	int ref;
+
+public:
+	// Konstruktor 
+	ShopServer( InitDatei *zIni );
+	// Destruktor 
+	virtual ~ShopServer();
+	// nicht constant 
+	void runn();
+	void thread();
+	void close();
+	bool serverStarten();
+	bool serverPause();
+	bool serverFortsetzen();
+	bool serverBeenden();
+    bool setMaxKarten( int mk );
+	bool absturzKlient( int klientId );
+	bool removeKlient( ShSKlient *zKlient );
+	void addGesendet( int bytes );
+	void addEmpfangen( int bytes );
+	// conatant 
+	bool istAn() const;
+	Server *zServer() const;
+	ShSDatenbank *zDB() const;
+    InitDatei *zInit() const;
+	bool hatClients() const;
+	int getId() const;
+	char *getLetzterFehler() const;
+	// Reference Counting
+	ShopServer *getThis();
+	ShopServer *release();
+};
+
+class ShSAKlient : public Thread
+{
+private:
+	SKlient *klient;
+	Text *name;
+	Text *passwort;
+	int adminId;
+	ShopServer *shs;
+
+public:
+	// Konstruktor 
+	ShSAKlient( SKlient *klient, ShopServer *shs );
+	// Destruktor 
+	virtual ~ShSAKlient();
+	// nicht constant
+	void thread();
+	void errorZuKlient( const char *nachricht ) const; // sendet eine Fehlernachricht zum AKlient
+};
+
+class ShSKlient : public Thread
+{
+private:
+	SKlient     *klient;
+	unsigned int klientNummer;
+	ShopServer *shs;
+	int ref;
+
+public:
+	// Konstruktor 
+	ShSKlient( SKlient *klient, ShopServer *shs );
+	// Destruktor 
+	virtual ~ShSKlient();
+	// nicht constant
+	void absturz();
+	void thread();
+	// constant
+	void errorZuKlient( const char *nachricht ) const; // sendet eine Fehlernachricht zum Klient
+	int getKlientNummer() const;
+	// Reference Counting
+	ShSKlient *getThis();
+	ShSKlient *release();
+};
+
+#endif

+ 74 - 0
ShopServer/ShopServer.vcxproj

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{e9aaef53-0fd8-4d09-b683-f1890bb87a4a}</ProjectGuid>
+    <Keyword>Linux</Keyword>
+    <RootNamespace>ShopServer</RootNamespace>
+    <MinimumVisualStudioVersion>15.0</MinimumVisualStudioVersion>
+    <ApplicationType>Linux</ApplicationType>
+    <ApplicationTypeRevision>1.0</ApplicationTypeRevision>
+    <TargetLinuxPlatform>Generic</TargetLinuxPlatform>
+    <LinuxProjectType>{D51BCBC9-82E9-4017-911E-C93873C4EA2B}</LinuxProjectType>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <RemoteRootDir>/home/kolja/projects</RemoteRootDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <RemoteRootDir>/home/kolja/projects</RemoteRootDir>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings" />
+  <ImportGroup Label="Shared" />
+  <ImportGroup Label="PropertySheets" />
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <TargetExt />
+    <RemoteProjectDir>$(RemoteRootDir)/Server/$(ProjectName)/Release</RemoteProjectDir>
+    <IncludePath>..\..\..\..\Allgemein\Framework;../../../Framework/Release;..\..\..\..\Allgemein\Network\Network;../../../Network/Release;..\..\..\..\Allgemein\sql\sql;../../../sql/Release;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <TargetExt />
+    <RemoteProjectDir>$(RemoteRootDir)/Server/$(ProjectName)/Debug</RemoteProjectDir>
+    <IncludePath>..\..\..\..\Allgemein\Framework;../../../Framework/Debug;..\..\..\..\Allgemein\Network\Network;../../../Network/Debug;..\..\..\..\Allgemein\sql\sql;../../../sql/Debug;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <ItemGroup>
+    <ClCompile Include="Datenbank.cpp" />
+    <ClCompile Include="main.cpp" />
+    <ClCompile Include="ShopServer.cpp" />
+    <ClCompile Include="Updater.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Datenbank.h" />
+    <ClInclude Include="ShopServer.h" />
+    <ClInclude Include="Updater.h" />
+  </ItemGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Link>
+      <AdditionalLibraryDirectories>$(RemoteRootDir)/sql/Release/bin/x64/release;$(RemoteRootDir)/Network/Release/bin/x64/release;$(RemoteRootDir)/Framework/Release/bin/x64/release;/usr/lib/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <LibraryDependencies>Framework;Network;SQL;pq;pthread</LibraryDependencies>
+      <AdditionalOptions>-Wl,-rpath,../lib %(AdditionalOptions)</AdditionalOptions>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Link>
+      <AdditionalOptions>-Wl,-rpath,../lib %(AdditionalOptions)</AdditionalOptions>
+      <AdditionalLibraryDirectories>$(RemoteRootDir)/sql/Debug/bin/x64/debug;$(RemoteRootDir)/Network/Debug/bin/x64/debug;$(RemoteRootDir)/Framework/Debug/bin/x64/debug;/usr/lib/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <LibraryDependencies>dbgFramework;dbgNetwork;dbgSQL;pq;pthread</LibraryDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets" />
+</Project>

+ 36 - 0
ShopServer/ShopServer.vcxproj.filters

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Headerdateien">
+      <UniqueIdentifier>{d0075e6c-ba6f-4581-a2b4-827705f8442f}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Quelldateien">
+      <UniqueIdentifier>{0d79d4d0-cb3d-4dc0-80ba-d9e24fe584ba}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Datenbank.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="main.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="ShopServer.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Updater.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Updater.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="ShopServer.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Datenbank.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>

+ 152 - 0
ShopServer/Updater.cpp

@@ -0,0 +1,152 @@
+#include "ShopServer.h"
+#include <Klient.h>
+#include <iostream>
+
+// Inhalt der Updater Klasse aus Updater.h
+// Konstruktor
+Updater::Updater( ShopServer *shServ )
+    : Thread()
+{
+    shs = shServ;
+    beenden = 0;
+    ref = 1;
+    start();
+}
+
+// Destruktor
+Updater::~Updater()
+{
+    beenden = 1;
+    warteAufThread( 5000 );
+    if( isRunning() )
+        ende();
+    shs->release();
+}
+
+// nicht constant
+void Updater::thread()
+{
+    while( !beenden )
+    {
+        for( int i = 0; i < 60; i++ )
+        {
+            if( beenden )
+                break;
+            Sleep( 1000 );
+        }
+        if( beenden )
+            break;
+        int kId = shs->zDB()->getUpdateKarte( shs->getId() );
+        if( kId )
+        {
+            Text updatePf = shs->zInit()->zWert( "ShopSeitenPfad" )->getText();
+            updatePf += "/update";
+            DateiRemove( updatePf );
+            int port = 0;
+            Text ip = "";
+            if( !shs->zDB()->getEditorServerPortIp( kId, &port, &ip ) )
+                continue;
+            Klient *k = new Klient();
+            unsigned char key[ 20 ] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
+            k->setEmpfangKey( (char*)key, 20 );
+            k->setSendeKey( (char*)key, 20 );
+            char ret = 0;
+            if( !k->verbinde( (unsigned short)port, ip ) )
+            {
+                k = k->release();
+                std::cout << "ShS: Updater: Fehler beim Updaten von Karte " << kId << ".\n Verbindung zum Editorserver konnte nicht hergestellt werden.\n";
+                continue;
+            }
+            k->sendeEncrypted( "\x8", 1 );
+            k->getNachrichtEncrypted( &ret, 1 );
+            if( ret == 1 )
+            {
+                k->sendeEncrypted( (char*)&kId, 4 );
+                k->getNachrichtEncrypted( &ret, 1 );
+                if( ret == 1 )
+                {
+                    int anz = 0;
+                    k->getNachrichtEncrypted( (char*)&anz, 4 );
+                    for( int i = 0; i < anz && !beenden; i++ )
+                    {
+                        char len = 0;
+                        k->getNachrichtEncrypted( &len, 1 );
+                        if( !len )
+                            continue;
+                        char *pfa = new char[ len + 1 ];
+                        pfa[ (int)len ] = 0;
+                        k->getNachrichtEncrypted( pfa, len );
+                        __int64 size = 0;
+                        k->getNachrichtEncrypted( (char*)&size, 8 );
+                        char *buffer = new char[ 2048 ];
+                        Text pfad = updatePf;
+                        pfad += pfa;
+                        delete[] pfa;
+                        Datei d;
+                        d.setDatei( pfad );
+                        d.erstellen();
+                        d.open( Datei::Style::schreiben );
+                        while( size )
+                        {
+                            int l = size >= 2048 ? 2048 : (int)size;
+                            k->getNachricht( buffer, l );
+                            d.schreibe( buffer, l );
+                            size -= l;
+                        }
+                        d.close();
+                        delete[] buffer;
+                    }
+                    if( beenden )
+                    {
+                        k->sendeEncrypted( "\3", 1 );
+                        k->getNachrichtEncrypted( &ret, 1 );
+                        k->trenne();
+                        k->release();
+                        break;
+                    }
+                    Text neuPfad = shs->zInit()->zWert( "ShopSeitenPfad" )->getText();
+                    neuPfad += "/karten/";
+                    neuPfad += kId;
+                    DateiRemove( neuPfad );
+                    DateiUmbenennen( updatePf, neuPfad );
+                }
+            }
+            if( ret == 3 )
+            {
+                char byte = 0;
+                k->getNachrichtEncrypted( &byte, 1 );
+                char *f = new char[ byte + 1 ];
+                f[ (int)byte ] = 0;
+                k->getNachrichtEncrypted( f, byte );
+                std::cout << "ShS: Updater: Fehler beim Update von Karte " << kId << ".\n Meldung: " << f << "\n";
+                delete[] f;
+                k->sendeEncrypted( "\3", 1 );
+                k->getNachrichtEncrypted( &ret, 1 );
+                k->trenne();
+                k->release();
+                continue;
+            }
+            k->sendeEncrypted( "\3", 1 );
+            k->getNachrichtEncrypted( &ret, 1 );
+            k->trenne();
+            k->release();
+            shs->zDB()->endUpdateKarte( kId );
+        }
+    }
+    run = 0;
+}
+
+// Reference Counting
+Updater *Updater::getThis()
+{
+    ref++;
+    return this;
+}
+
+Updater *Updater::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}

+ 29 - 0
ShopServer/Updater.h

@@ -0,0 +1,29 @@
+#ifndef UPDATER_H
+#define UPDATER_H
+
+#include <Thread.h>
+
+using namespace Framework;
+
+class ShopServer;
+
+class Updater : private Thread
+{
+private:
+    ShopServer *shs;
+    bool beenden;
+    int ref;
+
+public:
+    // Konstruktor
+    Updater( ShopServer *ahServ );
+    // Destruktor
+    virtual ~Updater();
+    // nicht constant
+    void thread() override;
+    // Reference Counting
+    Updater *getThis();
+    Updater *release();
+};
+
+#endif

+ 54 - 0
ShopServer/main.cpp

@@ -0,0 +1,54 @@
+#include "ShopServer.h"
+#include <Zeit.h>
+#include <iostream>
+#include <fstream>
+#include <Globals.h>
+
+int main()
+{
+    Framework::initFramework();
+	Zeit *z = getZeit();
+	Text *pfad = new Text( "../log/shop/" );
+	pfad->append( z->getZeit( "y-m-d h-i-s.log" ) );
+	z->release();
+	DateiPfadErstellen( pfad->getThis() );
+	std::ofstream file;
+	file.open( pfad->getText() );
+	std::streambuf* sbuf = std::cout.rdbuf();
+	std::cout.rdbuf( file.rdbuf() );
+	pfad->release();
+
+	std::cout << "ShS: Startet...\n";
+	std::cout << "ShS: Lese init Datei ../data/shsInit.ini ...\n";
+	InitDatei *dat = new InitDatei( "../data/shsInit.ini" );
+	if( !dat->laden() )
+	{
+		std::cout << "ShS: error: Datei konnte nicht gelesen werden. Das Programm wird geschlossen.\n";
+		dat->release();
+		exit( 1 );
+	}
+    const char *wichtig[] = { "ServerId", "DBBenutzer", "DBPasswort", "DBName", "DBIP", "DBPort", "Aktiv", "ShopSeitenPfad" };
+    for( const char *w : wichtig )
+    {
+        if( !dat->wertExistiert( w ) )
+        {
+            std::cout << "ShS: error: Der Wert '" << w << "' wurde nicht gefunden. Das Programm wird geschlossen.\n";
+            dat->release();
+            exit( 1 );
+        }
+    }
+
+	ShopServer *shServer = new ShopServer( dat );
+
+	std::cout << "ShS: Der Admin Server läuft. Startforgang beendet.\n";
+	shServer->runn();
+
+	shServer->ende();
+	shServer->release();
+	dat->release();
+	std::cout << "ShS: Der Server ist heruntergefahren.\n";
+	file.close();
+	std::cout.rdbuf( sbuf );
+    Framework::releaseFramework();
+	return 0;
+}

BIN
ShopServer/readme/images/ArchOptions.gif


BIN
ShopServer/readme/images/ChangeRemote.gif


BIN
ShopServer/readme/images/ManageConnections.gif


BIN
ShopServer/readme/images/OutputTypes.gif


BIN
ShopServer/readme/images/debuggerexport.png


BIN
ShopServer/readme/images/firstconnection.png


BIN
ShopServer/readme/images/linker.png


BIN
ShopServer/readme/images/postbuild.png


+ 85 - 0
ShopServer/readme/readme.html

@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset='utf-8'>
+
+    <link rel="stylesheet" type="text/css" href="stylesheet.css" media="screen">
+
+    <title>Getting Started</title>
+  </head>
+
+<body>
+
+    <div class="container">
+        <div id="header">
+            <h1>Getting Started</h1>
+            <h2>Visual C++ for Linux Development extension</h2>
+        </div>
+    
+    <table>
+    <tr>    
+    <div id="main_content">
+        
+        <td>
+        <div id="lpanel">
+            <h1>Setting up your project for Linux Development</h1>
+
+            <p>With this extension you can author C++ code for Linux servers, desktops and devices. You can manage your connections to these machines from within VS. VS will automatically copy and remote build your sources and can launch your application with the debugger. Our project system supports targeting specific architectures, including ARM.</p>
+            <img src="images\ArchOptions.gif"/>
+            
+            <h1>Connecting to Linux</h1>
+            <h2>Prerequisites</h2>
+            <p>Today we only support building remotely on the Linux target machine. We are not limited by specific Linux distros but we do have dependencies on the presence of some tools. Specifically, we need openssh-server, g++, gdb and gdbserver. Use your favorite package manager to install them, e.g. on Debian based systems: sudo apt-get install openssh-server g++ gdb gdbserver</p>
+            
+            <h2>First connection</h2>
+            <p>The first time you target a Linux machine you will be prompted for connection information.  This is triggered by building the project.</p>
+            <img src="images\firstconnection.png"/>
+                
+            <h2>Adding and removing connections</h2>
+            <p>To add a new connection, go to Tools > Options and search for Linux. From here you can add and remove connections.</p>
+            <img src="images\ManageConnections.gif"/>
+            
+            <p>To change which connection a project is using go to the project properties remote settings and update the target machine.</p>
+            <img src="images\ChangeRemote.gif"/>
+            
+            <h1>Project Properties</h1>
+            <p>All of the options necessary to control C++ compilation are exposed on the project properies pages. We'll cover a few specific to how things work for Linux. First under remote settings, you will see the remote root is set to ~/projects/ by default and that we are setting the remote project directory to match our project name in that location. </p>
+            <img src="images\OutputTypes.gif"/>
+            
+            <p>Looking at the General settings for the project, you can see how our output and intermediate directories were configured. Additionally, you’ll see that this project was configured as an application – thus our executable is under bin/x64/Debug/ as ConsoleApplication1.out. Notice that for configuration types we also support static and dynamic libraries.</p>
+            
+            <p>Add additional library dependencies on the Linker > Input property page.</p>
+            <img src="images\linker.png"/>
+            
+            <p>You can pass additional pre launch commands to the debugger to do things like launch graphical apps on the remote linux machine.</p>
+            <img src="images\debuggerexport.png"/>
+            
+            <p>You can also send post build events to control remote behavior, as in this example that exports a gpio pin for use without requiring the executable run as super user.</p>
+            <img src="images\postbuild.png"/>
+            
+        </div>
+        </td>
+        <td>
+        <div id="rpanel">
+
+            <h1>Resources</h1>
+
+            <p>Check out the <a href="http://aka.ms/vslinuxext">VS Gallery VC++ for Linux Development page</a> where we will keep updates posted. You can also check out our <a href="https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development">announcment blog post</a> for more in depth details on configuring the project properties.</p>
+            
+            <p>Here are other utilities you will find useful in connection with this extension.</p>
+            <ul>
+                <li>Learn more about <a href="http://aka.ms/vsiot">IoT Development</a></li>
+                <li><a href="http://aka.ms/vsiotext">VC++ for IoT Development Tools</a></li>
+                <li><a href="https://github.com/Azure/azure-iot-sdks">Azure IoT SDK</a>, includes a C API for connecting small devices to the Azure IoT Hub</li>
+            </ul>
+
+            <h1>Give us feedback</h1>
+            <p><a href="http://aka.ms/vslinux-feedback">UserVoice</a></p>
+        </div>
+        </td>   
+    </div>
+    </tr>
+    </table>
+    </div>
+</body>
+</html>

+ 119 - 0
ShopServer/readme/stylesheet.css

@@ -0,0 +1,119 @@
+body {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  color: #1E1E1E;
+  font-size: 13px;
+  font-family: "Segoe UI", Helvetica, Arial, sans-serif;
+  line-height: 1.45;
+  word-wrap: break-word;
+}
+
+/* General & 'Reset' Stuff */
+
+
+.container {
+  width: 1100px;
+  margin: 0 auto;
+}
+
+section {
+  display: block;
+  margin: 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  margin: 0;
+}
+
+table, tr {
+    width: 1100px;
+    padding: 0px;
+    vertical-align: top;
+  }
+
+/* Header, <header>
+   header   - container
+   h1       - project name
+   h2       - project description
+*/
+
+#header {
+  color: #FFF;
+  background: #68217a;
+  position:relative;
+}
+h1, h2 {
+  font-family: "Segoe UI Light", "Segoe UI", Helvetica, Arial, sans-serif;
+  line-height: 1;
+  margin: 0 18px;;
+  padding: 0;
+}
+#header h1 {
+  font-size: 3.4em;
+  padding-top: 18px;
+  font-weight: normal;
+  margin-left: 15px;
+}
+
+#header h2 {
+  font-size: 1.5em;
+  margin-top: 10px;
+  padding-bottom: 18px;
+  font-weight: normal;
+}
+
+#main_content {
+  width: 100%;
+  display: flex;
+  flex-direction: row;
+}
+
+
+h1, h2, h3, h4, h5, h6 {
+  font-weight: bolder;
+}
+
+#main_content h1 {
+  font-size: 1.8em;
+  margin-top: 34px;
+}
+
+    #main_content h1:first-child {
+        margin-top: 30px;
+    }
+
+#main_content h2 {
+  font-size: 1.8em;
+}
+p, ul {
+    margin: 11px 18px;
+}
+
+#main_content a {
+    color: #06C;
+    text-decoration: none;
+}
+ul {
+        margin-top: 13px;
+    margin-left: 18px;
+    padding-left: 0;
+}
+    ul li {
+        margin-left: 18px;
+        padding-left: 0;
+    }
+#lpanel {
+    width: 870px;
+    float: left;
+}
+#rpanel ul {
+    list-style-type: none;
+}
+    #rpanel ul li {
+        line-height: 1.8em;
+    }
+#rpanel {
+    background: #e7e7e7;
+    width: 230px;
+}

+ 2 - 0
build.bat

@@ -0,0 +1,2 @@
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Shop Server.sln" /t:rebuild /p:configuration=debug /p:platform=x64
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Shop Server.sln" /t:rebuild /p:configuration=release /p:platform=x64

+ 11 - 0
data/shsInit.ini

@@ -0,0 +1,11 @@
+DBBenutzer=shopserveru
+DBPasswort=LTShopServerPW
+DBName=koljadb
+DBIP=127.0.0.1
+DBPort=5432
+ServerName=Test
+ServerPort=49131
+ServerIP=127.0.0.1
+AdminServerPort=49130
+Aktiv=FALSE
+MaxClients=50

+ 167 - 0
shop/karten/3/seite/start.ksgs

@@ -0,0 +1,167 @@
+{name='MAIN'#
+  <befehl='ErstellGlobalVariable';name='Fenster';typ='Fenster'>
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='setGröße';br='555';hö='380'>
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='setOptionen';opt='0x3'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='beschreibung';txt=
+'Dies ist eine Karte für das Spiel Linie.
+Maximale Spieleranzahl: 10
+Teamanzahl: 10
+Maximale Spieler pro Team: 1
+Spieltyp: Alle gegen Alle';x='5';y='5';br='545';hö='120'>
+  <befehl='SetVariable';variable='GoldBild';wert=<befehl='_GetBild';pfad='data/bilder/system.ltdb';name='system.ltdb/gold.jpg'>;sichtbarkeit='global';typ='Bild'>
+  <befehl='SetVariable';variable='SilberBild';wert=<befehl='_GetBild';pfad='data/bilder/system.ltdb';name='system.ltdb/silber.jpg'>;sichtbarkeit='global';typ='Bild'>
+  <befehl='SetVariable';variable='KupferBild';wert=<befehl='_GetBild';pfad='data/bilder/system.ltdb';name='system.ltdb/kupfer.jpg'>;sichtbarkeit='global';typ='Bild'>
+  <befehl='SetVariable';variable='BesitzStatus';wert=<befehl='_GetBesitzStatus'>;sichtbarkeit='global';typ='Zahl'>
+  <befehl='SetVariable';variable='ErwerbbarStatus';wert=<befehl='_GetErwerbbarStatus'>;sichtbarkeit='global';typ='Zahl'>
+  <befehl='Funktionsaufruf';funktion='TESTVERSION'>
+  <befehl='Funktionsaufruf';funktion='VOLLVERSION'>
+}
+
+{name='TESTVERSION'#
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='2'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='1'>;sonst=<befehl='Überspringen';anzahl='4'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='versionbesitz';txt='Du besitzt die Testversion dieser Karte.';x='5';y='90';br='300';hö='20'>
+  <befehl='ErstellLokalVariable';name='verbleibendT';typ='Text';wert='Anzahl verbleibender Spiele: '>
+  <befehl='Funktionsaufruf';objekt="verbleibendT";funktion='anhängen';wert=<befehl='_GetTestVersionStatus'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='tvsv';txt="verbleibendT";x='5';y='110';br='300';hö='20'>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='1'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="ErwerbbarStatus";wert2='2'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="ErwerbbarStatus";wert2='0'>;dann=<befehl='Return'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='tve';txt='10 Spiele Testversion';x='5';y='280';br='300';hö='20'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='tvkosten';txt='Kosten: ';x='5';y='305';br='50';hö='20'>
+  <befehl='Funktionsaufruf';objekt="tvkosten";funktion='addOptionen';optionen='0x600'>
+  <befehl='SetVariable';variable='Preis';wert=<befehl='_GetPreis';testversion='true'>;sichtbarkeit='lokal';typ='Zahl'>
+  <befehl='ErstellLokalVariable';name='GoldT';typ='Text';wert=''>
+  <befehl='ErstellLokalVariable';name='SilberT';typ='Text';wert=''>
+  <befehl='ErstellLokalVariable';name='KupferT';typ='Text';wert=''>
+  <befehl='Funktionsaufruf';objekt="GoldT";funktion='anhängen';wert=<befehl='/';wert1="Preis";wert2='10000';runden='ab'>>
+  <befehl='Funktionsaufruf';objekt="SilberT";funktion='anhängen';wert=<befehl='/';wert1=<befehl='/';wert1="Preis";wert2='100';runden='ab'>;wert2='100';runden='rest'>>
+  <befehl='Funktionsaufruf';objekt="KupferT";funktion='anhängen';wert=<befehl='/';wert1="Preis";wert2='100';runden='rest'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='TVGoldTF';txt="GoldT";x='60';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='TVSilberTF';txt="SilberT";x='90';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='TVKupferTF';txt="KupferT";x='120';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='TVGoldBO';bild="GoldBild";x='60';y='305'>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='TVSilberBO';bild="SilberBild";x='90';y='305'>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='TVKupferBO';bild="KupferBild";x='120';y='305'>
+  <befehl='Funktionsaufruf';objekt="TVGoldBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVSilberBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVSilberBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';funktion='KNOPF_ERSTELLEN';name='TVKaufen';txt='Erwerben';x='5';y='330';br='100';hö='20'>
+  <befehl='Funktionsaufruf';objekt="TVKaufen";funktion='setMausEreignis';fname='TVKME'>
+  <befehl='SetVariable';variable='Geld';wert=<befehl='_GetKupfer'>;sichtbarkeit='lokal';typ='Zahl'>
+  <befehl='Wenn';bedingung=<befehl='<=';wert1="Preis";wert2="Geld">;dann=<befehl='Return'>>
+  <befehl='Funktionsaufruf';objekt="TVKaufen";funktion='löscheOptionen';optionen='0x2'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='TVNGK';txt='Du hast nicht genug Geld.';x='5';y='355';br='200';hö='20'>
+}
+
+{name='VOLLVERSION'#
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='2'>;sonst=<befehl='Überspringen';anzahl='1'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='versionbesitz';txt='Du besitzt die Vollversion dieser Karte.';x='5';y='90';br='300';hö='20'>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='2'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="ErwerbbarStatus";wert2='1'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="ErwerbbarStatus";wert2='0'>;dann=<befehl='Return'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='vve';txt='Vollversion';x='0';y='280';br='100';hö='20'>
+  <befehl='Funktionsaufruf';objekt="vve";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="vve";funktion='setX';x=<befehl='-';wert1='550';wert2=<befehl='Funktionsaufruf';objekt="vve";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='vvkosten';txt='Kosten: ';x='410';y='305';br='50';hö='20'>
+  <befehl='Funktionsaufruf';objekt="vvkosten";funktion='addOptionen';optionen='0x600'>
+  <befehl='SetVariable';variable='Preis';wert=<befehl='_GetPreis';testversion='false'>;sichtbarkeit='lokal';typ='Zahl'>
+  <befehl='ErstellLokalVariable';name='GoldT';typ='Text';wert=''>
+  <befehl='ErstellLokalVariable';name='SilberT';typ='Text';wert=''>
+  <befehl='ErstellLokalVariable';name='KupferT';typ='Text';wert=''>
+  <befehl='Funktionsaufruf';objekt="GoldT";funktion='anhängen';wert=<befehl='/';wert1="Preis";wert2='10000';runden='ab'>>
+  <befehl='Funktionsaufruf';objekt="SilberT";funktion='anhängen';wert=<befehl='/';wert1=<befehl='/';wert1="Preis";wert2='100';runden='ab'>;wert2='100';runden='rest'>>
+  <befehl='Funktionsaufruf';objekt="KupferT";funktion='anhängen';wert=<befehl='/';wert1="Preis";wert2='100';runden='rest'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='VVGoldTF';txt="GoldT";x='470';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='VVSilberTF';txt="SilberT";x='500';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='VVKupferTF';txt="KupferT";x='530';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='VVGoldBO';bild="GoldBild";x=<befehl='+';wert1=<befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='getX'>;wert2=<befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='getBreite'>>;y='305'>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='VVSilberBO';bild="SilberBild";x=<befehl='+';wert1=<befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='getX'>;wert2=<befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='getBreite'>>;y='305'>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='VVKupferBO';bild="KupferBild";x=<befehl='+';wert1=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getX'>;wert2=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getBreite'>>;y='305'>
+  <befehl='Funktionsaufruf';objekt="vvkosten";funktion='setX';x=<befehl='-';wert1=<befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='getX'>;wert2='55'>>
+  <befehl='Funktionsaufruf';funktion='KNOPF_ERSTELLEN';name='VVKaufen';txt='Erwerben';x='450';y='330';br='100';hö='20'>
+  <befehl='Funktionsaufruf';objekt="VVKaufen";funktion='setMausEreignis';fname='VVKME'>
+  <befehl='SetVariable';variable='Geld';wert=<befehl='_GetKupfer'>;sichtbarkeit='lokal';typ='Zahl'>
+  <befehl='Wenn';bedingung=<befehl='<=';wert1="Preis";wert2="Geld">;dann=<befehl='Return'>>
+  <befehl='Funktionsaufruf';objekt="VVKaufen";funktion='löscheOptionen';optionen='0x2'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='VVNGK';txt='Du hast nicht genug Geld.';x='390';y='355';br='160';hö='20'>  
+}
+
+{name='BILD_ERSTELLEN';übergabe=[name='name';typ='Text'];übergabe=[name='bild';typ='Bild'];übergabe=[name='x';typ='Zahl'];übergabe=[name='y';typ='Zahl']#
+  <befehl='ErstellGlobalVariable';name="name";typ='BildObjekt'>
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setBild';bild="bild">
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setOptionen';optionen='0x1'>
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setPosition';x="x";y="y">
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setGrößeNachBild'>
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='addMember';obj=<befehl='GetVariable';name="name">>
+}
+
+{name='TEXT_ERSTELLEN';übergabe=[name='name';typ='Text'];übergabe=[name='txt';typ='Text'];übergabe=[name='x';typ='Zahl'];übergabe=[name='y';typ='Zahl'];übergabe=[name='br';typ='Zahl'];übergabe=[name='hö';typ='Zahl']#
+  <befehl='ErstellGlobalVariable';name="name";typ='TextFeld';wert="txt">
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setOptionen';optionen='0x101'>
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setFläche';x="x";y="y";br="br";hö="hö">
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='addMember';obj=<befehl='GetVariable';name="name">>
+}
+
+{name='KNOPF_ERSTELLEN';übergabe=[name='name';typ='Text'];übergabe=[name='txt';typ='Text'];übergabe=[name='x';typ='Zahl'];übergabe=[name='y';typ='Zahl'];übergabe=[name='br';typ='Zahl'];übergabe=[name='hö';typ='Zahl']#
+  <befehl='ErstellGlobalVariable';name="name";typ='Knopf';wert="txt">
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='addOptionen';optionen='0x1'>
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setFläche';x="x";y="y";br="br";hö="hö">
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='addMember';obj=<befehl='GetVariable';name="name">>
+}
+
+{name='TVKME';übergabe=[name='me';typ='MausEreignis']#
+  <befehl='Wenn';bedingung=<befehl='==';wert1=<befehl='Funktionsaufruf';objekt="me";funktion='getEreignisId'>;wert2='3'>;sonst=<befehl='Return'>>
+  <befehl='_Kaufen';testversion='true'>
+}
+
+{name='VVKME';übergabe=[name='me';typ='MausEreignis']#
+  <befehl='Wenn';bedingung=<befehl='==';wert1=<befehl='Funktionsaufruf';objekt="me";funktion='getEreignisId'>;wert2='3'>;sonst=<befehl='Return'>>
+  <befehl='_Kaufen';testversion='false'>
+}
+
+{name='MAUS';übergabe=[name='me';typ='MausEreignis']#
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='mausEreignis';me="me">
+}
+
+{name='TASTATUR';übergabe=[name='te';typ='TastaturEreignis']#
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='tastaturEreignis';te="te">
+}
+
+{name='TICK';typ='Wahrheitswert';übergabe=[name='zeit';typ='Kommazahl']#
+  <befehl='Return';wert=<befehl='Funktionsaufruf';objekt="Fenster";funktion='tick';zeit="zeit">>
+}
+
+{name='RENDER';übergabe=[name='xOff';typ='Zahl'];übergabe=[name='yOff';typ='Zahl'];übergabe=[name='zRObj';typ='Bild']#
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='render';x="xOff";y="yOff";zrobj="zRObj">
+}

BIN
shop/karten/3/titelbg.ltdb


+ 169 - 0
shop/spiele/2/seite/start.ksgs

@@ -0,0 +1,169 @@
+{name='MAIN'#
+  <befehl='ErstellGlobalVariable';name='Fenster';typ='Fenster'>
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='setGröße';br='555';hö='380'>
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='setOptionen';opt='0x3'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='beschreibung';txt=
+'Bei dem Spiel Linie bewegen sich alle Spieler in einer konstanten Geschwindigkeit
+durch ein Spielfeld. Die Sieler können nur auf ihre Richtung einfluss nehmen, indem 
+sie von sich aus gesehen entweder eine Linkskurve oder eine Rechtskurve machen.
+Jeder Spieler hinterlässt beim bewegen eine Linie, die von keinem Spieler berührt
+werden darf. Berührt ein Spieler eine solche Linie, hat er die Runde verloren. Jedes
+Spiel besteht aus mehreren Runden. Gewinnen tut am ende der Spieler, der in den
+meißten Runden am längsten überlebt hat. Viel Spaß beil Spielen!';x='5';y='5';br='545';hö='120'>
+  <befehl='SetVariable';variable='GoldBild';wert=<befehl='_GetBild';pfad='data/bilder/system.ltdb';name='system.ltdb/gold.jpg'>;sichtbarkeit='global';typ='Bild'>
+  <befehl='SetVariable';variable='SilberBild';wert=<befehl='_GetBild';pfad='data/bilder/system.ltdb';name='system.ltdb/silber.jpg'>;sichtbarkeit='global';typ='Bild'>
+  <befehl='SetVariable';variable='KupferBild';wert=<befehl='_GetBild';pfad='data/bilder/system.ltdb';name='system.ltdb/kupfer.jpg'>;sichtbarkeit='global';typ='Bild'>
+  <befehl='SetVariable';variable='BesitzStatus';wert=<befehl='_GetBesitzStatus'>;sichtbarkeit='global';typ='Zahl'>
+  <befehl='SetVariable';variable='ErwerbbarStatus';wert=<befehl='_GetErwerbbarStatus'>;sichtbarkeit='global';typ='Zahl'>
+  <befehl='Funktionsaufruf';funktion='TESTVERSION'>
+  <befehl='Funktionsaufruf';funktion='VOLLVERSION'>
+}
+
+{name='TESTVERSION'#
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='2'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='1'>;sonst=<befehl='Überspringen';anzahl='4'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='versionbesitz';txt='Du besitzt die Testversion dieses Spiels.';x='5';y='125';br='300';hö='20'>
+  <befehl='ErstellLokalVariable';name='verbleibendT';typ='Text';wert='Anzahl verbleibender Spiele: '>
+  <befehl='Funktionsaufruf';objekt="verbleibendT";funktion='anhängen';wert=<befehl='_GetTestVersionStatus'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='tvsv';txt="verbleibendT";x='5';y='145';br='300';hö='20'>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='1'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="ErwerbbarStatus";wert2='2'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="ErwerbbarStatus";wert2='0'>;dann=<befehl='Return'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='tve';txt='10 Spiele Testversion';x='5';y='280';br='300';hö='20'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='tvkosten';txt='Kosten: ';x='5';y='305';br='50';hö='20'>
+  <befehl='Funktionsaufruf';objekt="tvkosten";funktion='addOptionen';optionen='0x600'>
+  <befehl='SetVariable';variable='Preis';wert=<befehl='_GetPreis';testversion='true'>;sichtbarkeit='lokal';typ='Zahl'>
+  <befehl='ErstellLokalVariable';name='GoldT';typ='Text';wert=''>
+  <befehl='ErstellLokalVariable';name='SilberT';typ='Text';wert=''>
+  <befehl='ErstellLokalVariable';name='KupferT';typ='Text';wert=''>
+  <befehl='Funktionsaufruf';objekt="GoldT";funktion='anhängen';wert=<befehl='/';wert1="Preis";wert2='10000';runden='ab'>>
+  <befehl='Funktionsaufruf';objekt="SilberT";funktion='anhängen';wert=<befehl='/';wert1=<befehl='/';wert1="Preis";wert2='100';runden='ab'>;wert2='100';runden='rest'>>
+  <befehl='Funktionsaufruf';objekt="KupferT";funktion='anhängen';wert=<befehl='/';wert1="Preis";wert2='100';runden='rest'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='TVGoldTF';txt="GoldT";x='60';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='TVSilberTF';txt="SilberT";x='90';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='TVKupferTF';txt="KupferT";x='120';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='TVGoldBO';bild="GoldBild";x='60';y='305'>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='TVSilberBO';bild="SilberBild";x='90';y='305'>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='TVKupferBO';bild="KupferBild";x='120';y='305'>
+  <befehl='Funktionsaufruf';objekt="TVGoldBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVSilberBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVSilberBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVGoldTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVSilberTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';objekt="TVKupferBO";funktion='addX';x=<befehl='Funktionsaufruf';objekt="TVKupferTF";funktion='getBreite'>>
+  <befehl='Funktionsaufruf';funktion='KNOPF_ERSTELLEN';name='TVKaufen';txt='Erwerben';x='5';y='330';br='100';hö='20'>
+  <befehl='Funktionsaufruf';objekt="TVKaufen";funktion='setMausEreignis';fname='TVKME'>
+  <befehl='SetVariable';variable='Geld';wert=<befehl='_GetKupfer'>;sichtbarkeit='lokal';typ='Zahl'>
+  <befehl='Wenn';bedingung=<befehl='<=';wert1="Preis";wert2="Geld">;dann=<befehl='Return'>>
+  <befehl='Funktionsaufruf';objekt="TVKaufen";funktion='löscheOptionen';optionen='0x2'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='TVNGK';txt='Du hast nicht genug Geld.';x='5';y='355';br='200';hö='20'>
+}
+
+{name='VOLLVERSION'#
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='2'>;sonst=<befehl='Überspringen';anzahl='1'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='versionbesitz';txt='Du besitzt die Vollversion dieses Spiels.';x='5';y='125';br='300';hö='20'>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="BesitzStatus";wert2='2'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="ErwerbbarStatus";wert2='1'>;dann=<befehl='Return'>>
+  <befehl='Wenn';bedingung=<befehl='==';wert1="ErwerbbarStatus";wert2='0'>;dann=<befehl='Return'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='vve';txt='Vollversion';x='0';y='280';br='100';hö='20'>
+  <befehl='Funktionsaufruf';objekt="vve";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="vve";funktion='setX';x=<befehl='-';wert1='550';wert2=<befehl='Funktionsaufruf';objekt="vve";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='vvkosten';txt='Kosten: ';x='410';y='305';br='50';hö='20'>
+  <befehl='Funktionsaufruf';objekt="vvkosten";funktion='addOptionen';optionen='0x600'>
+  <befehl='SetVariable';variable='Preis';wert=<befehl='_GetPreis';testversion='false'>;sichtbarkeit='lokal';typ='Zahl'>
+  <befehl='ErstellLokalVariable';name='GoldT';typ='Text';wert=''>
+  <befehl='ErstellLokalVariable';name='SilberT';typ='Text';wert=''>
+  <befehl='ErstellLokalVariable';name='KupferT';typ='Text';wert=''>
+  <befehl='Funktionsaufruf';objekt="GoldT";funktion='anhängen';wert=<befehl='/';wert1="Preis";wert2='10000';runden='ab'>>
+  <befehl='Funktionsaufruf';objekt="SilberT";funktion='anhängen';wert=<befehl='/';wert1=<befehl='/';wert1="Preis";wert2='100';runden='ab'>;wert2='100';runden='rest'>>
+  <befehl='Funktionsaufruf';objekt="KupferT";funktion='anhängen';wert=<befehl='/';wert1="Preis";wert2='100';runden='rest'>>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='VVGoldTF';txt="GoldT";x='470';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='VVSilberTF';txt="SilberT";x='500';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='VVKupferTF';txt="KupferT";x='530';y='305';br='0';hö='0'>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='addOptionen';optionen='0x600'>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='setGrößeNachText'>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='setHöhe';hö='20'>
+  <befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='addX';x=<befehl='-';wert1='0';wert2=<befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='getBreite'>>>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='VVGoldBO';bild="GoldBild";x=<befehl='+';wert1=<befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='getX'>;wert2=<befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='getBreite'>>;y='305'>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='VVSilberBO';bild="SilberBild";x=<befehl='+';wert1=<befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='getX'>;wert2=<befehl='Funktionsaufruf';objekt="VVSilberTF";funktion='getBreite'>>;y='305'>
+  <befehl='Funktionsaufruf';funktion='BILD_ERSTELLEN';name='VVKupferBO';bild="KupferBild";x=<befehl='+';wert1=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getX'>;wert2=<befehl='Funktionsaufruf';objekt="VVKupferTF";funktion='getBreite'>>;y='305'>
+  <befehl='Funktionsaufruf';objekt="vvkosten";funktion='setX';x=<befehl='-';wert1=<befehl='Funktionsaufruf';objekt="VVGoldTF";funktion='getX'>;wert2='55'>>
+  <befehl='Funktionsaufruf';funktion='KNOPF_ERSTELLEN';name='VVKaufen';txt='Erwerben';x='450';y='330';br='100';hö='20'>
+  <befehl='Funktionsaufruf';objekt="VVKaufen";funktion='setMausEreignis';fname='VVKME'>
+  <befehl='SetVariable';variable='Geld';wert=<befehl='_GetKupfer'>;sichtbarkeit='lokal';typ='Zahl'>
+  <befehl='Wenn';bedingung=<befehl='<=';wert1="Preis";wert2="Geld">;dann=<befehl='Return'>>
+  <befehl='Funktionsaufruf';objekt="VVKaufen";funktion='löscheOptionen';optionen='0x2'>
+  <befehl='Funktionsaufruf';funktion='TEXT_ERSTELLEN';name='VVNGK';txt='Du hast nicht genug Geld.';x='390';y='355';br='160';hö='20'>  
+}
+
+{name='BILD_ERSTELLEN';übergabe=[name='name';typ='Text'];übergabe=[name='bild';typ='Bild'];übergabe=[name='x';typ='Zahl'];übergabe=[name='y';typ='Zahl']#
+  <befehl='ErstellGlobalVariable';name="name";typ='BildObjekt'>
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setBild';bild="bild">
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setOptionen';optionen='0x1'>
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setPosition';x="x";y="y">
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setGrößeNachBild'>
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='addMember';obj=<befehl='GetVariable';name="name">>
+}
+
+{name='TEXT_ERSTELLEN';übergabe=[name='name';typ='Text'];übergabe=[name='txt';typ='Text'];übergabe=[name='x';typ='Zahl'];übergabe=[name='y';typ='Zahl'];übergabe=[name='br';typ='Zahl'];übergabe=[name='hö';typ='Zahl']#
+  <befehl='ErstellGlobalVariable';name="name";typ='TextFeld';wert="txt">
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setOptionen';optionen='0x101'>
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setFläche';x="x";y="y";br="br";hö="hö">
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='addMember';obj=<befehl='GetVariable';name="name">>
+}
+
+{name='KNOPF_ERSTELLEN';übergabe=[name='name';typ='Text'];übergabe=[name='txt';typ='Text'];übergabe=[name='x';typ='Zahl'];übergabe=[name='y';typ='Zahl'];übergabe=[name='br';typ='Zahl'];übergabe=[name='hö';typ='Zahl']#
+  <befehl='ErstellGlobalVariable';name="name";typ='Knopf';wert="txt">
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='addOptionen';optionen='0x1'>
+  <befehl='Funktionsaufruf';objekt=<befehl='GetVariable';name="name">;funktion='setFläche';x="x";y="y";br="br";hö="hö">
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='addMember';obj=<befehl='GetVariable';name="name">>
+}
+
+{name='TVKME';übergabe=[name='me';typ='MausEreignis']#
+  <befehl='Wenn';bedingung=<befehl='==';wert1=<befehl='Funktionsaufruf';objekt="me";funktion='getEreignisId'>;wert2='3'>;sonst=<befehl='Return'>>
+  <befehl='_Kaufen';testversion='true'>
+}
+
+{name='VVKME';übergabe=[name='me';typ='MausEreignis']#
+  <befehl='Wenn';bedingung=<befehl='==';wert1=<befehl='Funktionsaufruf';objekt="me";funktion='getEreignisId'>;wert2='3'>;sonst=<befehl='Return'>>
+  <befehl='_Kaufen';testversion='false'>
+}
+
+{name='MAUS';übergabe=[name='me';typ='MausEreignis']#
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='mausEreignis';me="me">
+}
+
+{name='TASTATUR';übergabe=[name='te';typ='TastaturEreignis']#
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='tastaturEreignis';te="te">
+}
+
+{name='TICK';typ='Wahrheitswert';übergabe=[name='zeit';typ='Kommazahl']#
+  <befehl='Return';wert=<befehl='Funktionsaufruf';objekt="Fenster";funktion='tick';zeit="zeit">>
+}
+
+{name='RENDER';übergabe=[name='xOff';typ='Zahl'];übergabe=[name='yOff';typ='Zahl'];übergabe=[name='zRObj';typ='Bild']#
+  <befehl='Funktionsaufruf';objekt="Fenster";funktion='render';x="xOff";y="yOff";zrobj="zRObj">
+}

BIN
shop/spiele/2/titelbg.ltdb