void WeaponTower::update( Crawler *closestEnemy, float dist , float dt, TowerGameApp *game )
{
	if (m_type == Type_NODULE)
	{
		// nodules dont do anything
		return;
	}
	

	// don't update if out of range or no bug
	ParticleEmitter *emitter = m_psys->getEmitter( 0 );
	if ((dist > m_sensorRange) || (!closestEnemy)) 
	{
		emitter->setEnabled( false );
		return;
	}

	// turn on the juice
	emitter->setEnabled( true );	

	// aim at the bug
	Vector3 myPos = m_platform->getPosition();
	Vector3 crawlerPos = closestEnemy->getNode()->getPosition();
	Vector3 dir = crawlerPos - myPos;
	dir.y = 0.0;
	dir.normalise();

	//Radian targetHeading = Ogre::Math::ATan2( dir.x, dir.z );	
	//m_bracket->yaw( targetHeading );
	m_bracket->setDirection( dir, Ogre::Node::TS_WORLD );

	dir = crawlerPos - (myPos + Vector3( 0.0, 7.0, 0.0));
	//float adj = sqrt((dir.x * dir.x) + ( dir.z * dir.z));
	//Radian angle = Ogre::Math::ATan2( dir.y, adj );
	//m_gun->pitch( angle, Ogre::Node::TS_LOCAL);
	m_gun->setDirection( dir, Ogre::Node::TS_WORLD );

	//game->mFrameListener->mDebugText = " blarg blarg";

	// Ok.. now actually apply damage	
	if (m_timeout < 0.001)
	{		

#if 0
		Ray shooty( m_gun->getWorldPosition(),
				m_gun->getWorldOrientation().zAxis() );
		RaySceneQuery *rayQuery = m_sceneMgr ->createRayQuery( shooty );
		rayQuery->setQueryMask( MASK_CRAWLER );

		RaySceneQueryResult &result = rayQuery->execute();
		RaySceneQueryResult::iterator itr = result.begin();

		/// did we hit a crawler
		game->mFrameListener->mDebugText = String("Hit Test: ");
		if (itr != result.end() && ( itr->movable))
        {
			game->mFrameListener->mDebugText += String(" movable: ") + itr->movable->getName();

			SceneNode *node = itr->movable->getParentSceneNode();
			if (node)
			{
				game->mFrameListener->mDebugText +=  node->getName();

				// did we hit a crawler??
				for (std::vector<Crawler*>::iterator ci = game->m_crawlers.begin();
					ci != game->m_crawlers.end(); ++ci )
				{
					if ( (*ci)->getNode() == node )
					{
						// hit!
						(*ci)->m_health -= m_damage;
					}
				}
			}
		}

		 m_sceneMgr->destroyQuery(rayQuery);
#endif

		 // forget all of that nonsense... just hit the
		 // closest crawler
		 if (m_type == Type_FLAMETHROWER)
		 {
			 // TODO: should be all enemies within range
			closestEnemy->m_health -= m_damage * dt;
		 }
		 else
		 {
			 closestEnemy->m_health -= m_damage;
		 }

		// reset timeout
		m_timeout = m_reloadTime;
	}
	else
	{
		// wait to 'recharge'
		m_timeout -= dt;
	}


}