Browse Source

Bestenlisten hinzugefügt
Base eroberungs Timer hinzugefügt

Kolja Strohm 5 years ago
parent
commit
cf45e46ad7

+ 69 - 19
StickmanWorldOnline/Aktionen.cpp

@@ -2650,31 +2650,14 @@ void BooleanRechnung::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMem
         case TASTE:
             setReturn( new Boolean( ( op == GLEICH ) == ( ( (Integer *)zParam( 0 ) )->getValue() == ( (Integer *)zParam( 1 ) )->getValue() ) ) );
             break;
-        case TIMER:
-        case TEAM:
-        case BARIERE:
-        case SCHALTER:
-        case BASE:
-        case DROP:
-        case GEGENSTAND:
-        case GESCHOSS:
-        case SCHIENE:
-        case TUNNEL:
-        case UMLENKUNG:
-        case TRIGGER:
-        case FEUERBALL_TREFFER:
-        case AKTION:
-        case GAME_OBJEKT:
-        case ALLE:
-        case SPIELER:
-            setReturn( new Boolean( ( op == GLEICH ) == ( zParam( 0 ) == zParam( 1 ) ) ) );
-            break;
         case GEGENSTAND_TYP:
             setReturn( new Boolean( ( op == GLEICH ) == ( ( (GegenstandTypVar *)zParam( 0 ) )->getValue() == ( (GegenstandTypVar *)zParam( 1 ) )->getValue() ) ) );
             break;
         case GESCHOSS_TYP:
             setReturn( new Boolean( ( op == GLEICH ) == ( ( (String *)zParam( 0 ) )->getValue().istGleich( ( (String *)zParam( 1 ) )->getValue() ) ) ) );
             break;
+        default:
+            setReturn( new Boolean( ( op == GLEICH ) == ( zParam( 0 ) == zParam( 1 ) ) ) );
         }
     }
     if( op == GREATER || op == SMALLER || op == GREATER_OR_EQUAL || op == SMALLER_OR_EQUAL )
@@ -2843,4 +2826,71 @@ IntegerAusFloat::IntegerAusFloat( RCArray< Aktion > *subActions )
 void IntegerAusFloat::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
 {
     setReturn( new Integer( (int)( (Float *)zParam( 0 ) )->getValue() ) );
+}
+
+
+BestenlisteNeu::BestenlisteNeu( RCArray<Aktion> *subActions )
+    : Aktion( BESTENLISTE_NEU, subActions )
+{}
+
+void BestenlisteNeu::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
+{
+    Bestenliste *b = new Bestenliste( zSpiel->getNextId(), zSpiel->zResources()->getSchrift() );
+    zSpiel->addBestenliste( b );
+    setReturn( b->getThis() );
+}
+
+
+BestenlisteAddZeile::BestenlisteAddZeile( RCArray<Aktion> *subActions )
+    : Aktion( BESTENLISTE_ADD_ZEILE, subActions )
+{
+    erlaubteTypen.add( STRING );
+    erlaubteTypen.add( BESTENLISTE );
+}
+
+void BestenlisteAddZeile::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
+{
+    ( (Bestenliste *)zParam( 1 ) )->addZeile( ( (String *)zParam( 0 ) )->getValue() );
+}
+
+
+BestenlisteAddSpalte::BestenlisteAddSpalte( RCArray<Aktion> *subActions )
+    : Aktion( BESTENLISTE_ADD_SPALTE, subActions )
+{
+    erlaubteTypen.add( STRING );
+    erlaubteTypen.add( BESTENLISTE );
+}
+
+void BestenlisteAddSpalte::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
+{
+    ( (Bestenliste *)zParam( 1 ) )->addSpalte( ( (String *)zParam( 0 ) )->getValue() );
+}
+
+
+BestenlisteSetWert::BestenlisteSetWert( RCArray<Aktion> *subActions )
+    : Aktion( BESTENLISTE_SET_WERT, subActions )
+{
+    erlaubteTypen.add( STRING );
+    erlaubteTypen.add( STRING );
+    erlaubteTypen.add( STRING );
+    erlaubteTypen.add( BESTENLISTE );
+}
+
+void BestenlisteSetWert::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
+{
+    ( (Bestenliste *)zParam( 3 ) )->setWert( ( (String *)zParam( 0 ) )->getValue(), ( (String *)zParam( 1 ) )->getValue(), ( (String *)zParam( 3 ) )->getValue() );
+}
+
+
+BestenlisteGetWert::BestenlisteGetWert( RCArray<Aktion> *subActions )
+    : Aktion( BESTENLISTE_GET_WERT, subActions )
+{
+    erlaubteTypen.add( STRING );
+    erlaubteTypen.add( STRING );
+    erlaubteTypen.add( BESTENLISTE );
+}
+
+void BestenlisteGetWert::run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount )
+{
+    setReturn( new String( ( (Bestenliste *)zParam( 2 ) )->getWert( ( (String *)zParam( 0 ) )->getValue(), ( (String *)zParam( 1 ) )->getValue() ) ) );
 }

+ 46 - 1
StickmanWorldOnline/Aktionen.h

@@ -208,7 +208,12 @@ enum AktionTyp
     FLOAT_ZUFALL,
     INTEGER_AUS_FLOAT,
     KONSTANT_TASTE,
-    KONSTANT_GEGENSTAND_TYP
+    KONSTANT_GEGENSTAND_TYP,
+    BESTENLISTE_NEU,
+    BESTENLISTE_ADD_SPALTE,
+    BESTENLISTE_ADD_ZEILE,
+    BESTENLISTE_SET_WERT,
+    BESTENLISTE_GET_WERT
 };
 
 enum Operator
@@ -1836,3 +1841,43 @@ public:
     IntegerAusFloat( RCArray< Aktion > *subActions );
     void run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount ) override;
 };
+
+class BestenlisteNeu : public Aktion
+{
+public:
+    // f
+    BestenlisteNeu( RCArray< Aktion > *subActions );
+    void run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount ) override;
+};
+
+class BestenlisteAddZeile : public Aktion
+{
+public:
+    // f
+    BestenlisteAddZeile( RCArray< Aktion > *subActions );
+    void run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount ) override;
+};
+
+class BestenlisteAddSpalte : public Aktion
+{
+public:
+    // f
+    BestenlisteAddSpalte( RCArray< Aktion > *subActions );
+    void run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount ) override;
+};
+
+class BestenlisteSetWert : public Aktion
+{
+public:
+    // f
+    BestenlisteSetWert( RCArray< Aktion > *subActions );
+    void run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount ) override;
+};
+
+class BestenlisteGetWert : public Aktion
+{
+public:
+    // f
+    BestenlisteGetWert( RCArray< Aktion > *subActions );
+    void run( Spiel *zSpiel, Ereignis *zEreignis, LocalMemory *zMemory, ProgramCounter *zPC, double &waitCount ) override;
+};

+ 14 - 1
StickmanWorldOnline/Base.cpp

@@ -3,9 +3,14 @@
 #include "Ereignis.h"
 
 
-Base::Base( ResourceRegistry *zResources, int id, int x, int y, int width, int height, int maxTime, Team *team )
+Base::Base( ResourceRegistry *zResources, int id, int x, int y, int width, int height, bool showTimer, Punkt timerPosition, int timerFarbe, TextRenderer *tr, int maxTime, Team *team )
     : GameObject( BASE, x, y, width, height )
 {
+    this->tr = tr;
+    tr->setSchriftSize( 12 );
+    this->showTimer = showTimer;
+    this->timerPosition = timerPosition;
+    this->timerFarbe = timerFarbe;
     this->id = id;
     this->maxTime = maxTime;
     this->team = team;
@@ -19,6 +24,7 @@ Base::Base( ResourceRegistry *zResources, int id, int x, int y, int width, int h
 
 Base::~Base()
 {
+    tr->release();
     if( team )
         team->release();
     if( nextTeam )
@@ -84,6 +90,13 @@ void Base::tick( double time, Spiel *zSpiel )
     }
 }
 
+void Base::render( Bild &rObj )
+{
+    GameObject::render( rObj );
+    if( showTimer && inChange )
+        tr->renderText( timerPosition.x, timerPosition.y, Text( (int)( leftTime * 100 ) / 100.0 ), rObj, timerFarbe );
+}
+
 int Base::getId() const
 {
     return id;

+ 6 - 1
StickmanWorldOnline/Base.h

@@ -16,13 +16,18 @@ private:
     Team *nextTeam;
     float leftTime;
     ResourceRegistry *resources;
+    bool showTimer;
+    Punkt timerPosition;
+    int timerFarbe;
+    TextRenderer *tr;
 
 public:
-    Base( ResourceRegistry *zResources, int id, int x, int y, int width, int height, int maxTime = 10, Team * team = 0 );
+    Base( ResourceRegistry *zResources, int id, int x, int y, int width, int height, bool showTimer, Punkt timerPosition, int timerFarbe, TextRenderer *tr, int maxTime = 10, Team * team = 0 );
     ~Base();
     void setTeam( Team *team, Spiel *zSpiel );
     void startChange( Team *team );
     void tick( double time, Spiel *zSpiel );
+    void render( Bild &rObj ) override;
     int getId() const;
     Team *getTeam() const;
     Team *zTeam() const;

+ 161 - 0
StickmanWorldOnline/Bestenliste.cpp

@@ -0,0 +1,161 @@
+#include "Bestenliste.h"
+#include "Initialisierung.h"
+
+
+Bestenliste::Bestenliste( int id, Schrift *schrift )
+    : Variable( BESTENLISTE )
+{
+    this->schrift = schrift;
+    this->id = id;
+    ram.setFarbe( 0xFFFFFFFF );
+    ram.setRamenBreite( 1 );
+    sichtbar = 1;
+}
+
+Bestenliste::~Bestenliste()
+{
+    schrift->release();
+}
+
+int Bestenliste::getSpaltenBreite( int j ) const
+{
+    if( j == -1 )
+    {
+        int maxBr = 0;
+        for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
+        {
+            if( maxBr < zeilen.z( i )->getBreite() )
+                maxBr = zeilen.z( i )->getBreite();
+        }
+        return maxBr;
+    }
+    int maxBr = spalten.z( j )->getBreite();
+    for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
+    {
+        if( werte.z( i ) && werte.z( i )->z( j ) )
+        {
+            if( maxBr < werte.z( i )->z( j )->getBreite() )
+                maxBr = werte.z( i )->z( j )->getBreite();
+        }
+    }
+    return maxBr;
+}
+
+void Bestenliste::setSichtbar( bool sichtbar )
+{
+    this->sichtbar = sichtbar;
+}
+
+void Bestenliste::addSpalte( const char *name )
+{
+    spalten.add( initTextFeld( 0, 0, -1, -1, schrift, TextFeld::Style::Text | TextFeld::Style::Center, name ) );
+}
+
+void Bestenliste::addZeile( const char *name )
+{
+    zeilen.add( initTextFeld( 0, 0, -1, -1, schrift, TextFeld::Style::Text | TextFeld::Style::Center, name ) );
+}
+
+void Bestenliste::setWert( const char *spalte, const char *zeile, const char *wert )
+{
+    int spalteI = 0;
+    for( auto s = spalten.getIterator(); s; s++, spalteI++ )
+    {
+        if( s->zText() && s->zText()->istGleich( spalte ) )
+            break;
+    }
+    int zeileI = 0;
+    for( auto z = zeilen.getIterator(); z; z++, spalteI++ )
+    {
+        if( z->zText() && z->zText()->istGleich( zeile ) )
+            break;
+    }
+    if( !werte.z( zeileI ) )
+        werte.set( new RCArray< TextFeld >(), zeileI );
+    werte.z( zeileI )->set( initTextFeld( 0, 0, -1, -1, schrift, TextFeld::Style::Text | TextFeld::Style::Center, wert ), spalteI );
+}
+
+const char *Bestenliste::getWert( const char *spalte, const char *zeile )
+{
+    int spalteI = 0;
+    for( auto s = spalten.getIterator(); s; s++, spalteI++ )
+    {
+        if( s->zText() && s->zText()->istGleich( spalte ) )
+            break;
+    }
+    int zeileI = 0;
+    for( auto z = zeilen.getIterator(); z; z++, spalteI++ )
+    {
+        if( z->zText() && z->zText()->istGleich( zeile ) )
+            break;
+    }
+    if( !werte.z( zeileI ) || !werte.z( zeileI )->hat( spalteI ) || !werte.z( zeileI )->z( spalteI )->zText() )
+        return "";
+    return werte.z( zeileI )->z( spalteI )->zText()->getText();
+}
+
+void Bestenliste::render( int x, int y, Bild &rObj )
+{
+    ram.setPosition( x, y );
+    ram.setSize( getBreite(), getHeight() );
+    ram.render( rObj );
+    Array<int> spaltenBr;
+    x += 1;
+    y += 1;
+    int startX = x;
+    int br = getBreite();
+    int hi = getHeight();
+    int ssbr = getSpaltenBreite( -1 );
+    x += ssbr;
+    for( int i = 0; i < spalten.getEintragAnzahl(); i++ )
+    {
+        rObj.drawLinieV( x, y, hi - 2, 0xFFFFFFFF );
+        int sbr = getSpaltenBreite( i );
+        TextFeld *tf = spalten.z( i );
+        tf->setSize( sbr, 20 );
+        tf->setPosition( x, y );
+        tf->render( rObj );
+        x += sbr + 1;
+        spaltenBr.add( sbr );
+    }
+    x = startX;
+    for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
+    {
+        rObj.drawLinieH( x, y++, br - 2, 0xFFFFFFFF );
+        TextFeld *tf = zeilen.z( i );
+        tf->setSize( ssbr, 20 );
+        tf->setPosition( x, y );
+        tf->render( rObj );
+        x += ssbr + 1;
+        for( int j = 0; j < spalten.getEintragAnzahl(); j++ )
+        {
+            int sbr = spaltenBr.get( j );
+            TextFeld *tf = werte.z( i ) ? werte.z( i )->z( j ) : 0;
+            if( tf )
+            {
+                tf->setSize( sbr, 20 );
+                tf->setPosition( x, y );
+                tf->render( rObj );
+            }
+            x += sbr + 1;
+        }
+        x = startX;
+        y += 20;
+    }
+}
+
+int Bestenliste::getBreite() const
+{
+    int br = 1;
+    for( int i = -1; i < spalten.getEintragAnzahl(); i++ )
+        br += getSpaltenBreite( i ) + 1;
+    return 0;
+}
+
+int Bestenliste::getHeight() const
+{
+    int hi = 22;
+    for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
+        hi += 21;
+    return hi;
+}

+ 34 - 0
StickmanWorldOnline/Bestenliste.h

@@ -0,0 +1,34 @@
+#pragma once
+
+
+#include "Variablen.h"
+#include "Array.h"
+#include <TextFeld.h>
+#include <Rahmen.h>
+
+
+class Bestenliste : public Variable
+{
+private:
+    RCArray< TextFeld > spalten;
+    RCArray< TextFeld > zeilen;
+    RCArray< RCArray< TextFeld > > werte;
+    Schrift *schrift;
+    LRahmen ram;
+    int id;
+    bool sichtbar;
+
+    int getSpaltenBreite( int i ) const;
+
+public:
+    Bestenliste( int id, Schrift *schrift );
+    ~Bestenliste();
+    void setSichtbar( bool sichtbar );
+    void addSpalte( const char *name );
+    void addZeile( const char *name );
+    void setWert( const char *spalte, const char *zeile, const char *wert );
+    const char *getWert( const char *spalte, const char *zeile );
+    void render( int x, int y, Bild &rObj );
+    int getBreite() const;
+    int getHeight() const;
+};

+ 31 - 11
StickmanWorldOnline/Reader.cpp

@@ -388,7 +388,7 @@ Aktion *MapReader::readAktion( Datei &dat )
         params->release();
         char len;
         dat.lese( &len, 1 );
-        char *txt = new char[ len + 1 ];
+        char *txt = new char[ (__int64)len + 1 ];
         dat.lese( txt, len );
         txt[ (int)len ] = 0;
         Aktion *ret = new KonstantString( txt );
@@ -400,7 +400,7 @@ Aktion *MapReader::readAktion( Datei &dat )
         params->release();
         char len;
         dat.lese( &len, 1 );
-        char *txt = new char[ len + 1 ];
+        char *txt = new char[ (__int64)len + 1 ];
         dat.lese( txt, len );
         txt[ (int)len ] = 0;
         Aktion *ret = new KonstantVariable( txt );
@@ -428,7 +428,7 @@ Aktion *MapReader::readAktion( Datei &dat )
     {
         char len;
         dat.lese( &len, 1 );
-        char *txt = new char[ len + 1 ];
+        char *txt = new char[ (__int64)len + 1 ];
         dat.lese( txt, len );
         txt[ (int)len ] = 0;
         Aktion *ret = new SetVariable( txt, params );
@@ -611,6 +611,16 @@ Aktion *MapReader::readAktion( Datei &dat )
         return new FloatZufall( params );
     case INTEGER_AUS_FLOAT:
         return new IntegerAusFloat( params );
+    case BESTENLISTE_NEU:
+        return new BestenlisteNeu( params );
+    case BESTENLISTE_ADD_SPALTE:
+        return new BestenlisteAddSpalte( params );
+    case BESTENLISTE_ADD_ZEILE:
+        return new BestenlisteAddZeile( params );
+    case BESTENLISTE_SET_WERT:
+        return new BestenlisteSetWert( params );
+    case BESTENLISTE_GET_WERT:
+        return new BestenlisteGetWert( params );
     }
     params->release();
     return new KonstantNichts();
@@ -650,7 +660,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
     {
         char len = 0;
         datei->lese( &len, 1 );
-        char *txt = new char[ len + 1 ];
+        char *txt = new char[ (__int64)len + 1 ];
         txt[ (int)len ] = 0;
         datei->lese( txt, len );
         Text *name = new Text( txt );
@@ -740,6 +750,10 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         int maxTime;
         int team;
         int id;
+        bool showTimer;
+        int timerX;
+        int timerY;
+        int timerFarbe;
         mapFile.lese( (char *)& id, 4 );
         mapFile.lese( (char *)& x, 4 );
         mapFile.lese( (char *)& y, 4 );
@@ -747,7 +761,11 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         mapFile.lese( (char *)& height, 4 );
         mapFile.lese( (char *)& maxTime, 4 );
         mapFile.lese( (char *)& team, 4 );
-        zSpiel->addBase( new Base( zSpiel->zResources(), id, x, y, breite, height, maxTime, zSpiel->getTeam( team ) ) );
+        mapFile.lese( (char *)&showTimer, 1 );
+        mapFile.lese( (char *)&timerX, 4 );
+        mapFile.lese( (char *)&timerY, 4 );
+        mapFile.lese( (char *)&timerFarbe, 4 );
+        zSpiel->addBase( new Base( zSpiel->zResources(), id, x, y, breite, height, showTimer, Punkt( timerX, timerY ), timerFarbe, new TextRenderer( zSpiel->zResources()->getSchrift() ), maxTime, zSpiel->getTeam( team ) ) );
     }
     // Drops
     mapFile.lese( (char *)& anz, 4 );
@@ -772,7 +790,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
             mapFile.lese( (char *)& wahrscheinlichkeit[ j ], 4 );
         char len;
         mapFile.lese( (char *)& len, 1 );
-        char *name = new char[ (int)len + 1 ];
+        char *name = new char[ (__int64)len + 1 ];
         mapFile.lese( name, len );
         name[ (int)len ] = 0;
         zSpiel->addDrop( new Drop( id, minX, maxX, minY, maxY, maxTime, numDrops, name, wahrscheinlichkeit ) );
@@ -834,7 +852,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         mapFile.lese( (char *)& farbe, 4 );
         char len;
         mapFile.lese( (char *)& len, 1 );
-        char *name = new char[ (int)len + 1 ];
+        char *name = new char[ (__int64)len + 1 ];
         mapFile.lese( name, len );
         name[ (int)len ] = 0;
         zSpiel->addTimer( new Timer( zSpiel->zResources()->zSchrift(), id, name, maxZeit, x, y, sichtbar, autoWiederhohlung, runns, farbe ) );
@@ -894,7 +912,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
         mapFile.lese( (char *)& id, 4 );
         char len;
         mapFile.lese( (char *)& len, 1 );
-        char *name = new char[ (int)len + 1 ];
+        char *name = new char[ (__int64)len + 1 ];
         mapFile.lese( name, len );
         name[ (int)len ] = 0;
         int ereignisAnzahl;
@@ -921,7 +939,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
     {
         char len;
         mapFile.lese( (char *)& len, 1 );
-        char *name = new char[ (int)len + 1 ];
+        char *name = new char[ (__int64)len + 1 ];
         mapFile.lese( name, len );
         name[ (int)len ] = 0;
         char typ;
@@ -956,7 +974,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
             {
                 char len;
                 mapFile.lese( (char *)& len, 1 );
-                char *value = new char[ (int)len + 1 ];
+                char *value = new char[ (__int64)len + 1 ];
                 mapFile.lese( value, len );
                 value[ (int)len ] = 0;
                 var = new String( value );
@@ -967,7 +985,7 @@ void MapReader::ladeKarte( Spiel *zSpiel )
             {
                 char len;
                 mapFile.lese( (char *)& len, 1 );
-                char *value = new char[ (int)len + 1 ];
+                char *value = new char[ (__int64)len + 1 ];
                 mapFile.lese( value, len );
                 value[ (int)len ] = 0;
                 var = new String( getRichtungFromString( Text( value ) ) );
@@ -1065,6 +1083,8 @@ void MapReader::ladeKarte( Spiel *zSpiel )
                 var = zSpiel->getTrigger( id );
                 break;
             }
+            default:
+                var = new Variable( NICHTS );
             }
         }
         zSpiel->addVariable( name, var );

+ 16 - 4
StickmanWorldOnline/Spiel.cpp

@@ -734,8 +734,8 @@ void Spiel::stknVerarbeitung()
             spielerAnzahl = ( int ) * ( msg + 1 );
             for( int i = 0; i < spielerAnzahl; i++ )
             {
-                int sId = *(int *)( msg + 2 + i * 8 );
-                int aId = *(int *)( msg + 6 + i * 8 );
+                int sId = *(int *)( msg + 2 + (__int64)i * 8 );
+                int aId = *(int *)( msg + 6 + (__int64)i * 8 );
                 for( auto s = spieler.getIterator(); s; s++ )
                 {
                     if( s->getId() == sId )
@@ -751,7 +751,7 @@ void Spiel::stknVerarbeitung()
                     }
                 }
             }
-            __int64 seed = *(__int64 *)( msg + 2 + spielerAnzahl * 8 );
+            __int64 seed = *(__int64 *)( msg + 2 + (__int64)spielerAnzahl * 8 );
             randG.setSeed( seed );
             n->setVerarbeitet();
             break;
@@ -805,7 +805,7 @@ void Spiel::stknVerarbeitung()
         case 7: // chat nachricht
         {
             unsigned char len = ( unsigned char ) *msg;
-            char *buf = new char[ len + 1 ];
+            char *buf = new char[ (__int64)len + 1 ];
             memcpy( buf, msg + 1, len );
             buf[ len ] = 0;
             chat->addNachricht( buf );
@@ -885,6 +885,13 @@ void Spiel::render( Bild &zRObj )
             t->render( zRObj );
         zRObj.releaseDrawOptions();
     }
+    int y = 5;
+    for( auto b = bestenlisten.getIterator(); b; b++ )
+    {
+        int x = zRObj.getBreite() - b->getBreite() - 5;
+        b->render( x, y, zRObj );
+        y += b->getHeight() + 5;
+    }
     if( begonnen )
     {
         chat->render( zRObj );
@@ -1736,6 +1743,11 @@ void Spiel::addAnimation( SingleAnimation *animation )
     animations.add( animation );
 }
 
+void Spiel::addBestenliste( Bestenliste *b )
+{
+    bestenlisten.add( b );
+}
+
 int Spiel::läuft() const
 {
     if( !begonnen )

+ 3 - 0
StickmanWorldOnline/Spiel.h

@@ -23,6 +23,7 @@
 #include "Resource.h"
 #include "SpielerGUI.h"
 #include "SingleAnnimation.h"
+#include "Bestenliste.h"
 
 class Spiel : public SpielV
 {
@@ -54,6 +55,7 @@ private:
     RCArray< Trigger > trigger;
     RCArray< TriggerRun > triggerRuns;
     RCArray< SingleAnimation > animations;
+    RCArray< Bestenliste > bestenlisten;
     Punkt mapSize;
     Team *zWinner;
     Critical c;
@@ -247,6 +249,7 @@ public:
     Umlenkung *getUmlenkungZuletztBenutzt() const;
     ResourceRegistry *zResources() const;
     void addAnimation( SingleAnimation *animation );
+    void addBestenliste( Bestenliste *b );
     // constant
     int läuft() const override;
     // Reference Counting

+ 2 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj

@@ -22,6 +22,7 @@
     <ClCompile Include="Aktionen.cpp" />
     <ClCompile Include="Bariere.cpp" />
     <ClCompile Include="Base.cpp" />
+    <ClCompile Include="Bestenliste.cpp" />
     <ClCompile Include="BosheitRune.cpp" />
     <ClCompile Include="Brand.cpp" />
     <ClCompile Include="DLLStart.cpp" />
@@ -69,6 +70,7 @@
     <ClInclude Include="Aufzeichnung.h" />
     <ClInclude Include="Bariere.h" />
     <ClInclude Include="Base.h" />
+    <ClInclude Include="Bestenliste.h" />
     <ClInclude Include="BosheitRune.h" />
     <ClInclude Include="Brand.h" />
     <ClInclude Include="Dialog.h" />

+ 6 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj.filters

@@ -158,6 +158,9 @@
     <ClCompile Include="SingleAnnimation.cpp">
       <Filter>Spiel\Objekte</Filter>
     </ClCompile>
+    <ClCompile Include="Bestenliste.cpp">
+      <Filter>Spiel\Objekte</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Aufzeichnung.h">
@@ -314,5 +317,8 @@
     <ClInclude Include="SingleAnnimation.h">
       <Filter>Spiel\Objekte</Filter>
     </ClInclude>
+    <ClInclude Include="Bestenliste.h">
+      <Filter>Spiel\Objekte</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 1 - 0
StickmanWorldOnline/Variablen.h

@@ -33,6 +33,7 @@ enum VariableTyp
     FEUERBALL_TREFFER,
     AKTION,
     GAME_OBJEKT,
+    BESTENLISTE,
     ALLE
 };