#include "Strukturen.h"
#include <M2Datei.h>
#include <DateiSystem.h>
#include <Text.h>

// Inhalt der RessourceStr Klasse aus Strukturen.h
// Konstruktor
RessourceStr::RessourceStr( Datei *zDatei, SSDatenbankV *zDb, char *tmpPfad, int kId )
{
    zDatei->lese( (char *)& id, 4 );
    char len = 0;
    zDatei->lese( &len, 1 );
    Text txt;
    txt.fillText( '0', len + 1 );
    zDatei->lese( txt, len );
    txt.getText()[ (int)len ] = 0;
    pfad = 0;
    if( txt.positionVon( "spiel:" ) == 0 )
    {
        pfad = zDb->getSpielPfad( kId );
        if( pfad )
            pfad->append( txt.getTeilText( 6 ) );
    }
    if( txt.positionVon( "map:" ) == 0 )
    {
        pfad = new Text( tmpPfad );
        pfad->append( "map/files" );
        pfad->append( txt.getTeilText( 4 ) );
    }
    m2d = 0;
    bild = 0;
    if( pfad && pfad->hat( ".m2/" ) )
    {
        int pos = pfad->positionVon( ".m2/", pfad->anzahlVon( ".m2/" ) - 1 );
        M2Datei * datei = new M2Datei( pfad->getTeilText( 0, pos + 3 ) );
        datei->leseDaten();
        m2d = datei->ladeModel( pfad->getTeilText( pos + 4 ) );
        datei->release();
    }
    ref = 1;
}

// Destruktor
RessourceStr::~RessourceStr()
{
    if( pfad )
        pfad->release();
    if( m2d )
        m2d->release();
    if( bild )
        bild->release();
}

// constant
int RessourceStr::getId() const
{
    return id;
}

Model2DData *RessourceStr::zReccourceM2() const
{
    return m2d;
}

Bild *RessourceStr::zReccourceTxt() const
{
    return bild;
}

// Reference Counting
RessourceStr *RessourceStr::getThis()
{
    ref++;
    return this;
}

RessourceStr *RessourceStr::release()
{
    ref--;
    if( !ref )
        delete this;
    return 0;
}


// Inhalt der ObjektStr Klasse aus Strukturen.h
// Konstruktor
ObjektStr::ObjektStr( Datei * zDatei )
{
    if( zDatei )
    {
        zDatei->lese( (char *)& pos.x, 4 );
        zDatei->lese( (char *)& pos.y, 4 );
        zDatei->lese( (char *)& rot, 4 );
        zDatei->lese( (char *)& scale, 4 );
        zDatei->lese( (char *)& id, 4 );
        zDatei->lese( (char *)& m2d, 4 );
        zDatei->lese( (char *)& bild, 4 );
        zDatei->lese( (char *)& style, 4 );
        zDatei->lese( (char *)& maxStability, 4 );
        zDatei->lese( (char *)& maxEnergie, 4 );
        zDatei->lese( (char *)& energieRadius, 4 );
        zDatei->lese( (char *)& reparatur, 8 );
        zDatei->lese( (char *)& akkuLeistung, 8 );
        zDatei->lese( &team, 1 );
    }
    ref = 1;
}

void ObjektStr::save( Datei * zDatei ) const
{
    zDatei->schreibe( (char *)& pos.x, 4 );
    zDatei->schreibe( (char *)& pos.y, 4 );
    zDatei->schreibe( (char *)& rot, 4 );
    zDatei->schreibe( (char *)& scale, 4 );
    zDatei->schreibe( (char *)& id, 4 );
    zDatei->schreibe( (char *)& m2d, 4 );
    zDatei->schreibe( (char *)& bild, 4 );
    zDatei->schreibe( (char *)& style, 4 );
    zDatei->schreibe( (char *)& maxStability, 4 );
    zDatei->schreibe( (char *)& maxEnergie, 4 );
    zDatei->schreibe( (char *)& energieRadius, 4 );
    zDatei->schreibe( (char *)& reparatur, 8 );
    zDatei->schreibe( (char *)& akkuLeistung, 8 );
    zDatei->schreibe( (char *)& team, 1 );
}

// Reference Counting
ObjektStr *ObjektStr::getThis()
{
    ref++;
    return this;
}

ObjektStr *ObjektStr::release()
{
    ref--;
    if( !ref )
        delete this;
    return 0;
}


// Inhalt der SpielerStr Klasse aus Strukturen.h
// Konstruktor
SpielerStr::SpielerStr( Datei * zDatei )
{
    if( zDatei )
    {
        zDatei->lese( (char *)& id, 4 );
        zDatei->lese( (char *)& pos.x, 4 );
        zDatei->lese( (char *)& pos.y, 4 );
        zDatei->lese( (char *)& rot, 8 );
        zDatei->lese( (char *)& beschleunigung, 8 );
        zDatei->lese( (char *)& maxStability, 4 );
        zDatei->lese( (char *)& maxEnergie, 4 );
        zDatei->lese( (char *)& reparatur, 8 );
        zDatei->lese( (char *)& akkuLeistung, 8 );
        zDatei->lese( (char *)& laserIntensity, 4 );
        zDatei->lese( (char *)& laserEffizienz, 4 );
        zDatei->lese( (char *)& laserTempo, 4 );
        zDatei->lese( (char *)& wendigkeit, 8 );
        zDatei->lese( (char *)& antriebEffizienz, 8 );
        zDatei->lese( (char *)& energieSchild, 8 );
        zDatei->lese( (char *)& energieSchildEffizienz, 8 );
        zDatei->lese( (char *)& netzwerk, 4 );
        zDatei->lese( (char *)& skillPunkte, 4 );
        zDatei->lese( (char *)& m2d, 4 );
        zDatei->lese( (char *)& bild, 4 );
    }
    ref = 1;
}

void SpielerStr::save( Datei * zDatei ) const
{
    zDatei->schreibe( (char *)& id, 4 );
    zDatei->schreibe( (char *)& pos.x, 4 );
    zDatei->schreibe( (char *)& pos.y, 4 );
    zDatei->schreibe( (char *)& rot, 8 );
    zDatei->schreibe( (char *)& beschleunigung, 8 );
    zDatei->schreibe( (char *)& maxStability, 4 );
    zDatei->schreibe( (char *)& maxEnergie, 4 );
    zDatei->schreibe( (char *)& reparatur, 8 );
    zDatei->schreibe( (char *)& akkuLeistung, 8 );
    zDatei->schreibe( (char *)& laserIntensity, 4 );
    zDatei->schreibe( (char *)& laserEffizienz, 4 );
    zDatei->schreibe( (char *)& laserTempo, 4 );
    zDatei->schreibe( (char *)& wendigkeit, 8 );
    zDatei->schreibe( (char *)& antriebEffizienz, 8 );
    zDatei->schreibe( (char *)& energieSchild, 8 );
    zDatei->schreibe( (char *)& energieSchildEffizienz, 8 );
    zDatei->schreibe( (char *)& netzwerk, 4 );
    zDatei->schreibe( (char *)& skillPunkte, 4 );
    zDatei->schreibe( (char *)& m2d, 4 );
    zDatei->schreibe( (char *)& bild, 4 );
}

// Reference Counting
SpielerStr *SpielerStr::getThis()
{
    ref++;
    return this;
}

SpielerStr *SpielerStr::release()
{
    ref--;
    if( !ref )
        delete this;
    return 0;
}

// Inhalt der TeamStr Klasse aus Strukturen.h
// Konstruktor
TeamStr::TeamStr( Datei * zDatei )
{
    if( zDatei )
    {
        zDatei->lese( (char *)& id, 4 );
        zDatei->lese( (char *)& maxPunkte, 4 );
        zDatei->lese( (char *)& beschleunigung, 8 );
        zDatei->lese( (char *)& maxStability, 4 );
        zDatei->lese( (char *)& maxEnergie, 4 );
        zDatei->lese( (char *)& reparatur, 8 );
        zDatei->lese( (char *)& akkuLeistung, 8 );
        zDatei->lese( (char *)& laserIntensity, 4 );
        zDatei->lese( (char *)& laserEffizienz, 4 );
        zDatei->lese( (char *)& laserTempo, 4 );
        zDatei->lese( (char *)& wendigkeit, 8 );
        zDatei->lese( (char *)& antriebEffizienz, 8 );
        zDatei->lese( (char *)& energieSchild, 8 );
        zDatei->lese( (char *)& energieSchildEffizienz, 8 );
        zDatei->lese( (char *)& punkte, 4 );
    }
    ref = 1;
}

void TeamStr::save( Datei * zDatei ) const
{
    zDatei->schreibe( (char *)& id, 4 );
    zDatei->schreibe( (char *)& maxPunkte, 4 );
    zDatei->schreibe( (char *)& beschleunigung, 8 );
    zDatei->schreibe( (char *)& maxStability, 4 );
    zDatei->schreibe( (char *)& maxEnergie, 4 );
    zDatei->schreibe( (char *)& reparatur, 8 );
    zDatei->schreibe( (char *)& akkuLeistung, 8 );
    zDatei->schreibe( (char *)& laserIntensity, 4 );
    zDatei->schreibe( (char *)& laserEffizienz, 4 );
    zDatei->schreibe( (char *)& laserTempo, 4 );
    zDatei->schreibe( (char *)& wendigkeit, 8 );
    zDatei->schreibe( (char *)& antriebEffizienz, 8 );
    zDatei->schreibe( (char *)& energieSchild, 8 );
    zDatei->schreibe( (char *)& energieSchildEffizienz, 8 );
    zDatei->schreibe( (char *)& punkte, 4 );
}

// Reference Counting
TeamStr *TeamStr::getThis()
{
    ref++;
    return this;
}

TeamStr *TeamStr::release()
{
    ref--;
    if( !ref )
        delete this;
    return 0;
}