#include "munga.h"
#pragma hdrstop

#include "collorgn.h"
#include "mover.h"
#include "doorfram.h"

//
//#############################################################################
// CollisionOrigin
//#############################################################################
//
CollisionOrigin::CollisionOrigin(InterestZoneID interest_zone_ID):
	InterestOrigin(
		interest_zone_ID,
		CollisionInterestType,
      DefaultInterestDepth
   ),
   movingEntitySocket(NULL)
{
}

//
//#############################################################################
// ~CollisionOrigin
//#############################################################################
//
CollisionOrigin::~CollisionOrigin()
{
}

//
//#############################################################################
// TestInstance
//#############################################################################
//
Logical
	CollisionOrigin::TestInstance() const
{
	InterestOrigin::TestInstance();
   Check(&movingEntitySocket);
	return True;
}

//
//#############################################################################
// AddInterestingEntity
//#############################################################################
//
void
	CollisionOrigin::AddInterestingEntity(Entity *interesting_entity)
{
	Check(this);
	Check(interesting_entity);

	//
	//--------------------------------------------------------------------------
	// Make sure that we don't check against something that doesn't move
	//--------------------------------------------------------------------------
	//
	if (interesting_entity->IsDynamic())
	{
		//
		//-----------------------------------------------------------------------
		// If it is a mover and tangible, or a door, add it to our list
		//-----------------------------------------------------------------------
		//
		if (interesting_entity->IsDerivedFrom(*Mover::GetClassDerivations()))
		{
			Mover *mover = Cast_Object(Mover*, interesting_entity);
			if (mover->IsCollisionTestable())
			{
				movingEntitySocket.Add(interesting_entity);
			}
		}
		else if (interesting_entity->IsDerivedFrom(*DoorFrame::GetClassDerivations()))
		{
			movingEntitySocket.Add(interesting_entity);
		}
	}
}

//
//#############################################################################
// RemoveUninterestingEntity
//#############################################################################
//
void
	CollisionOrigin::RemoveUninterestingEntity(Entity *uninteresting_entity)
{
	Check(this);
   Check(uninteresting_entity);

	//
	// HACK - ECH The following may not be a legitimate assertion
	//
	#if DEBUG_LEVEL>0 && 0
	{
		SChainIteratorOf<Mover*> iterator(&movingEntitySocket);
		Verify(iterator.IsPlugMember(uninteresting_entity) == True);
	}
	#endif

	//
	// Remove from socket
	//
	PlugIterator iterator(uninteresting_entity);

   Check(&iterator);
	iterator.RemoveSocket(&movingEntitySocket);
}

//
//#############################################################################
// RemoveUninterestingEntities
//#############################################################################
//
void
	CollisionOrigin::RemoveUninterestingEntities()
{
	Check(this);

	SChainIteratorOf<Entity*> iterator(&movingEntitySocket);

   Check(&iterator);
   while (iterator.GetCurrent() != NULL)
   {
		Check(iterator.GetCurrent());
   	iterator.Remove();
   }
}

//~~~~~~~~~~~~~~~~~~~ CollisionOrigin__MovingEntityIterator ~~~~~~~~~~~~~~~~~~~

CollisionOrigin__MovingEntityIterator::CollisionOrigin__MovingEntityIterator(
   CollisionOrigin *collision_origin
):
	SChainIteratorOf<Entity*>(collision_origin->movingEntitySocket)
{
}

CollisionOrigin__MovingEntityIterator::~CollisionOrigin__MovingEntityIterator()
{
}
