#include "Karte.h"

// Inhalt der Karte Klasse aus Karte.h
// Konstruktor
Karte::Karte()
{
	size = Vec2< int >( 0, 0 );
	ressources = new RCArray< RessourceStr >();
	objekte = new RCArray< ObjektStr >();
	spieler = new RCArray< SpielerStr >();
	teams = new RCArray< TeamStr >();
	sts = 0;
	ref = 1;
}

// Destruktor
Karte::~Karte()
{
	ressources->release();
	objekte->release();
	spieler->release();
	teams->release();
	if( sts )
		sts->release();
}

// nicht constant
void Karte::ladeDaten( Datei *zDatei, SSDatenbankV *zDb, SpielerTeamStruktur *zSts, char *tmpPfad, int kId )
{
	sts = zSts->getThis();
	int ressourceAnz = 0;
	zDatei->lese( (char*)&ressourceAnz, 4 );
	for( int i = 0; i < ressourceAnz; i++ )
        ressources->add( new RessourceStr( zDatei, zDb, tmpPfad, kId ) );
	zDatei->lese( (char*)&size.x, 4 );
	zDatei->lese( (char*)&size.y, 4 );
	int objektAnzahl = 0;
	zDatei->lese( (char*)&objektAnzahl, 4 );
	for( int i = 0; i < objektAnzahl; i++ )
		objekte->add( new ObjektStr( zDatei ) );
	for( int i = 0; i < zSts->spielerAnzahl; i++ )
		spieler->add( new SpielerStr( zDatei ) );
	for( int i = 0; i < zSts->teamAnzahl; i++ )
		teams->add( new TeamStr( zDatei ) );
}

// constant
Vec2< int > Karte::getSize() const
{
	return size;
}

Spieler *Karte::createSpieler( int sNum ) const
{
	if( !sts || sNum < 0 || sNum >= sts->spielerAnzahl )
		return 0;
    for( auto s = spieler->getIterator(); s; s++ )
    {
        if( s->id == sNum + 1 )
        {
            Spieler *ret = new Spieler( s );
            for( auto i = ressources->getIterator(); i && i._; i++ )
            {
                if( i->getId() == s->m2d )
                    ret->setModelData( i->zReccourceM2()->getThis() );
            }
            ret->setSpielerFarbe( sts->spielerFarbe->hat( sNum ) ? sts->spielerFarbe->get( sNum ) : 0 );
            return ret;
        }
    }
    return 0;
}

Team *Karte::createTeam( int tNum ) const
{
	if( !sts || tNum < 0 || tNum >= sts->teamAnzahl )
		return 0;
    Team *ret = 0;
    for( auto t = teams->getIterator(); t; t++ )
        if( t->id == tNum + 1 )
            ret = new Team( sts->teamFarbe->get( tNum ), sts->teamName->z( tNum )->getText(), t );
	return ret;
}

SpielObjekt *Karte::createObjekt( int oNum ) const
{
	if( oNum <= 0 )
		return 0;
    for( auto o = objekte->getIterator(); o; o++ )
    {
        if( o->id == oNum )
        {
            SpielObjekt *ret = new SpielObjekt( o );
            for( auto i = ressources->getIterator(); i && i._; i++ )
            {
                if( i->getId() == o->m2d )
                    ret->setModel( i->zReccourceM2()->getThis() );
            }
            return ret;
        }
    }
    return 0;
}

Iterator< ObjektStr * > Karte::getObjekte() const
{
    return objekte->getIterator();
}

int Karte::getMaxTeamAnzahl() const
{
	return sts ? sts->teamAnzahl : 0;
}

int Karte::getMaxSpielerAnzahl() const
{
	return sts ? sts->spielerAnzahl : 0;
}

int Karte::getObjektAnzahl() const
{
	return objekte->getEintragAnzahl();
}

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

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