#include "MiniGame.h"
#include <Rahmen.h>
#include <Datei.h>
#include <InitDatei.h>
#include <DateiSystem.h>
#include <MausEreignis.h>

// Inhalt der Minigame Klasse aus MiniGame.h
// Konstruktor
MiniGame::MiniGame( char *name )
{
	xPos = 0;
	yPos = 0;
	xAbs = 0;
	yAbs = 0;
	zXPos = 0;
	zYPos = 0;
	xSpeed = 0;
	ySpeed = 0;
	this->name = new Text( name );
	bgBild = 0;
	mausAlpha = new AlphaFeld();
	mausAlpha->setGröße( 248, 98 );
	mausAlpha->setFarbe( 0xFF00FF00 );
	mausAlpha->setStärke( 50 );
	rahmen = new LRahmen();
	rahmen->setGröße( 250, 100 );
	rahmen->setFarbe( 0xFFFFFFFF );
	rahmen->setRamenBreite( 1 );
	sichtbar = 1;
	alpha = 0;
	mausIn = 0;
	ok = 1;
	rend = 0;
	ref = 1;
	Text *pfad = new Text( "data/Minigames/" );
	pfad->anhängen( name );
	if( !DateiExistiert( pfad->getThis() ) )
	{
		ok = 0;
		pfad->release();
		return;
	}
	pfad->anhängen( "/mg.ini" );
	if( !DateiExistiert( pfad->getThis() ) )
	{
		ok = 0;
		pfad->release();
		return;
	}
	InitDatei *mgIni = new InitDatei( pfad );
	if( !mgIni->laden() )
	{
		ok = 0;
		mgIni->release();
		return;
	}
	if( !mgIni->wertExistiert( "TitelBild" ) || !mgIni->wertExistiert( "TitelBildPfad" ) || !mgIni->wertExistiert( "DllPfad" ) )
	{
		ok = 0;
		mgIni->release();
		return;
	}
	Text *bPfad = new Text( "data/Minigames/" );
	bPfad->anhängen( name );
	bPfad->anhängen( "/" );
	bPfad->anhängen( mgIni->zWert( "TitelBildPfad" )->getText() );
	if( !DateiExistiert( bPfad->getThis() ) )
	{
		ok = 0;
		bPfad->release();
		mgIni->release();
		return;
	}
	LTDBDatei *bDat = new LTDBDatei();
	bDat->setDatei( bPfad );
	bDat->leseDaten( 0 );
	bgBild = bDat->laden( 0, mgIni->getWert( "TitelBild" ) );
	bDat->release();
	mgIni->release();
	if( !bgBild )
		ok = 0;
}

// Destruktor
MiniGame::~MiniGame()
{
	name->release();
	if( bgBild )
		bgBild->release();
	mausAlpha->release();
	rahmen->release();
}

// nicht constant
void MiniGame::setPosition( int x, int y )
{
	if( !xPos && !yPos )
	{
		xPos = x;
		yPos = y;
	}
	zXPos = x;
	zYPos = y;
	xAbs = (int)( zXPos - xPos );
	yAbs = (int)( zYPos - yPos );
}

void MiniGame::setSichtbar( bool sichtbar )
{
	this->sichtbar = sichtbar;
}

void MiniGame::doMausEreignis( MausEreignis &me )
{
	if( !this->sichtbar )
		return;
	if( me.mx > xPos && me.mx < xPos + 250 && me.my > yPos && me.my < yPos + 100 )
	{
		if( !mausIn )
		{
			rend = 1;
			rahmen->setFarbe( 0xFF00FF00 );
		}
		mausIn = 1;
	}
	else
	{
		if( mausIn )
		{
			rend = 1;
			rahmen->setFarbe( 0xFFFFFFFF );
		}
		mausIn = 0;
	}
	me.verarbeitet |= mausIn;
}

bool MiniGame::tick( double z )
{
	bool ret = rend;
	rend = 0;
	int val = (int)( z * 150 );
	if( sichtbar && alpha != 255 )
	{
		if( alpha + val > 255 )
			alpha = 255;
		else
			alpha += val;
		ret = 1;
	}
	if( !sichtbar && alpha )
	{
		if( alpha - val < 0 )
			alpha = 0;
		else
			alpha -= val;
		ret = 1;
	}
	if( xPos != zXPos || yPos != zYPos )
	{
		if( xPos != zXPos )
		{
			if( xAbs > 0 )
			{
				if( zXPos - xPos >= xAbs / 2 )
					xSpeed += xAbs * z;
				else
				{
					xSpeed -= xAbs * z;
					if( xSpeed < zXPos - xPos )
						xSpeed += xAbs * z;
				}
			}
			else
			{
				if( zXPos - xPos <= xAbs / 2 )
					xSpeed += xAbs * z;
				else
				{
					xSpeed -= xAbs * z;
					if( xSpeed > zXPos - xPos )
						xSpeed += xAbs * z;
				}
			}
		}
		if( yPos != zYPos )
		{
			if( yAbs > 0 )
			{
				if( zYPos - yPos >= yAbs / 2 )
					ySpeed += yAbs * z;
				else
				{
					ySpeed -= yAbs * z;
					if( ySpeed < zYPos - yPos )
						ySpeed += yAbs * z;
				}
			}
			else
			{
				if( zYPos - yPos <= yAbs / 2 )
					ySpeed += yAbs * z;
				else
				{
					ySpeed -= yAbs * z;
					if( ySpeed > zYPos - yPos )
						ySpeed += yAbs * z;
				}
			}
		}
		xPos += xSpeed * z;
		yPos += ySpeed * z;
		if( xAbs > 0 )
		{
			if( xPos >= zXPos )
			{
				xPos = zXPos;
				xSpeed = 0;
			}
		}
		else
		{
			if( xPos <= zXPos )
			{
				xPos = zXPos;
				xSpeed = 0;
			}
		}
		if( yAbs > 0 )
		{
			if( yPos >= zYPos )
			{
				yPos = zYPos;
				ySpeed = 0;
			}
		}
		else
		{
			if( yPos <= zYPos )
			{
				yPos = zYPos;
				ySpeed = 0;
			}
		}
		ret = 1;
	}
	return ret;
}

void MiniGame::render( Bild &zRObj )
{
	zRObj.setAlpha( alpha );
	zRObj.drawBild( (int)( xPos ), (int)( yPos ), 250, 100, *bgBild );
	rahmen->setPosition( (int)xPos, (int)yPos );
	rahmen->render( zRObj );
	if( mausIn )
	{
		mausAlpha->setPosition( (int)xPos + 1, (int)yPos + 1 );
		mausAlpha->render( zRObj );
	}
	zRObj.releaseAlpha();
}

// constant
Text *MiniGame::zName()
{
	return name;
}

bool MiniGame::istOk() const
{
	return ok;
}

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

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