#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( "/" );
		if( pfad )
			pfad->append( txt.getTeilText( 7 ) );
	}
	if( txt.positionVon( "map:" ) == 0 )
	{
		pfad = new Text( tmpPfad );
		if( pfad )
			pfad->append( txt.getTeilText( 5 ) );
	}
	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*)&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*)&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;
}