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

// Inhalt der RessourceStr Klasse aus Strukturen.h
// Konstruktor
RessourceStr::RessourceStr( Datei *zDatei, int karteId, Text *zGamePath )
{
	zDatei->lese( (char*)&id, 4 );
	char l�n = 0;
	zDatei->lese( &l�n, 1 );
	Text txt;
	txt.fillText( '0', l�n + 1 );
	zDatei->lese( txt, l�n );
	txt.getText()[ l�n ] = 0;
	pfad = 0;
	if( txt.positionVon( "spiel:" ) == 0 )
	{
		pfad = new Text( zGamePath->getText() );
		if( pfad )
			pfad->append( txt.getTeilText( 6 ) );
	}
	if( txt.positionVon( "map:" ) == 0 )
    {
        pfad = new Text( "data/tmp/Karten/" );
        pfad->append( karteId );
        pfad->append( "/spiel/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();
	}
	if( pfad && pfad->hat( ".ltdb/" ) )
	{
		int pos = pfad->positionVon( ".ltdb/", pfad->anzahlVon( ".ltdb/" ) - 1 );
		LTDBDatei *datei = new LTDBDatei();
		datei->setDatei( pfad->getTeilText( 0, pos + 5 ) );
		datei->leseDaten( 0 );
		bild = datei->laden( 0, pfad->getTeilText( pos + 6 ) );
		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 ZeichnungStr Klasse aus Strukturen.h
// Konstruktor
ObjektStr::ObjektStr( Datei *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*)&maxStabilit�t, 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;
}

// 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 )
{
	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*)&maxStabilit�t, 4 );
	zDatei->lese( (char*)&maxEnergie, 4 );
	zDatei->lese( (char*)&reparatur, 8 );
	zDatei->lese( (char*)&akkuLeistung, 8 );
	zDatei->lese( (char*)&laserIntensit�t, 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;
}

// 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 )
{
	zDatei->lese( (char*)&id, 4 );
	zDatei->lese( (char*)&maxPunkte, 4 );
	zDatei->lese( (char*)&beschleunigung, 8 );
	zDatei->lese( (char*)&maxStabilit�t, 4 );
	zDatei->lese( (char*)&maxEnergie, 4 );
	zDatei->lese( (char*)&reparatur, 8 );
	zDatei->lese( (char*)&akkuLeistung, 8 );
	zDatei->lese( (char*)&laserIntensit�t, 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;
}

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

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