#include "Chicken.h"
#include "../../item/Item.h"
#include "../../level/Level.h"

Chicken::Chicken( Level* level )
:   super(level),
	sheared(false),
	flap(0),
	oFlap(0),
	flapSpeed(0),
	oFlapSpeed(0),
	flapping(1),
	eggTime(0)
{
	entityRendererId = ER_CHICKEN_RENDERER;

	textureName = "mob/chicken.png";
	setSize(0.3f, 0.7f);
	eggTime = random.nextInt(SharedConstants::TicksPerSecond * 60 * 5) + SharedConstants::TicksPerSecond * 60 * 5;
}

int Chicken::getEntityTypeId() const
{
	return MobTypes::Chicken;
}


int Chicken::getMaxHealth()
{
	return 4;
}

void Chicken::aiStep()
{
	super::aiStep();

	oFlap = flap;
	oFlapSpeed = flapSpeed;

	flapSpeed += (onGround ? -1 : 4) * 0.3f;
	if (flapSpeed < 0) flapSpeed = 0;
	if (flapSpeed > 1) flapSpeed = 1;

	if (!onGround && flapping < 1) flapping = 1;
	flapping *= 0.9f;

	if (!onGround && yd < 0) {
		yd *= 0.6f;
	}

	flap += flapping * 2;

	//@todo
	if (!isBaby()) {
		if (!level->isClientSide && --eggTime <= 0) {
			level->playSound(this, "mob.chickenplop", 1.0f, (random.nextFloat() - random.nextFloat()) * 0.2f + 1.0f);
			spawnAtLocation(Item::egg->id, 1);
			eggTime = random.nextInt(SharedConstants::TicksPerSecond * 60 * 5) + SharedConstants::TicksPerSecond * 60 * 5;
		}
	}
}

void Chicken::addAdditonalSaveData( CompoundTag* tag )
{
	super::addAdditonalSaveData(tag);
}

void Chicken::readAdditionalSaveData( CompoundTag* tag )
{
	super::readAdditionalSaveData(tag);
}

void Chicken::causeFallDamage( float distance )
{
}

const char* Chicken::getAmbientSound()
{
	return "mob.chicken";
}

std::string Chicken::getHurtSound()
{
	return "mob.chickenhurt";
}

std::string Chicken::getDeathSound()
{	
	return "mob.chickenhurt";
}

//int Chicken::getDeathLoot()
//{
//	return Item::feather->id;
//}

void Chicken::dropDeathLoot( /*bool wasKilledByPlayer, int playerBonusLevel*/ )
{
	//// drop some feathers
	int count = random.nextInt(3);// + random.nextInt(1 + playerBonusLevel);
	for (int i = 0; i < count; i++) {
		spawnAtLocation(Item::feather->id, 1);
	}
	//// and some meat
	if (isOnFire()) spawnAtLocation(Item::chicken_cooked->id, 1); //@fire
	else
	    spawnAtLocation(Item::chicken_raw->id, 1);
}

Animal* Chicken::getBreedOffspring( Animal* target )
{
	return new Chicken(level);
}
