//	DropperTone.cpp - A Tone which drops Pickups
//  ----------------------------------------------------------------------------
//	This file is part of 'GameTemplate', template code for a game.
//	Copyright (C) 2011  Niall Moody
//	
//	This program is free software: you can redistribute it and/or modify
//	it under the terms of the GNU General Public License as published by
//	the Free Software Foundation, either version 3 of the License, or
//	(at your option) any later version.
//
//	This program is distributed in the hope that it will be useful,
//	but WITHOUT ANY WARRANTY; without even the implied warranty of
//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//	GNU General Public License for more details.
//
//	You should have received a copy of the GNU General Public License
//	along with this program.  If not, see <http://www.gnu.org/licenses/>.
//	----------------------------------------------------------------------------

#include "TonesSounder.h"
#include "DropperTone.h"
#include "Random.h"
#include "Pickup.h"

//------------------------------------------------------------------------------
DropperTone::DropperTone(int startRail,
						 int startNumRails,
						 TonesSounderPtr& sound):
Tone(startRail,
	 (float)startNumRails,
	 ThreeFloats(0.882f, 0.890f, 0.357f),
	 4.0f,
	 sound)
{
	setSynthIndex(sound->noteOn(startRail, 0.5f));
}

//------------------------------------------------------------------------------
DropperTone::~DropperTone()
{

}

//------------------------------------------------------------------------------
void DropperTone::setPickup(PickupPtr p)
{
	if(!p)
		pickup.reset();
	pickup = p;
}

//------------------------------------------------------------------------------
void DropperTone::tick()
{
	int i;
	PickupPtr p = pickup.lock();
	TwoFloats pickupPos;
	const float oldRailDist = (592.0f/(float)(getPrevNumRails()-1));
	const float newRailDist = (592.0f/(float)(getNumRails()-1));
	const float railDist = (getRailInterp() * newRailDist) +
						   ((1.0f-getRailInterp()) * oldRailDist);

	if(p)
	{
		//Update pickup's position.
		for(i=(TrailSize-1);i>0;--i)
			prevTrail[i] = prevTrail[i-1];
		prevTrail[0] = getPosition();

		p->setPosition(prevTrail[TrailSize-1]);

		//Drop pickup if necessary.
		if(getRail() == getNewRail())
		{
			if((getPosition().x < 1000.0f) && (Random::getGlobal().getRandomFloat() > 0.99f))
			{
				pickupPos = p->getPosition();
				pickupPos.y = 64 + (getNewRail() * railDist);
				p->setPosition(pickupPos);
				p->setTone(TonePtr());
				pickup.reset();
			}
			else if(getPosition().x < 256.0f)
			{
				pickupPos = p->getPosition();
				pickupPos.y = 64 + (getNewRail() * railDist);
				p->setPosition(pickupPos);
				p->setTone(TonePtr());
				pickup.reset();
			}
		}
	}
}
